2012-04-14 8 views
6

Ich habe vier Entitäten, die ich in Datenbanktabellen über Code ersten fließenden API übersetzen möchte (ich benutze ein Modell bei databaseanswers.org gefunden), aber ich bin nicht sicher wie. Das Problem, das ich habe, ist, dass SuggestedMenuId über zwei verschiedene Tabellen in einem zusammengesetzten Schlüssel (MenuCourse und CourseRecipeChoice) migriert wird.Code First Fluent API und Navigationseigenschaften in einer Join Tabelle

Hier ist die Botschaft, die ich bin immer:

„Ein oder mehrere Validierungsfehler wurden während der Modellerzeugung erfasst:

\ tSystem.Data.Entity.Edm.EdmAssociationConstraint: Die Zahl der Objekte in der Abhängige und Principal-Rollen in einer Beziehungsbedingung müssen identisch sein. "

Hier ist, was ich in meinem EntityTypeConfiguration Klasse versucht haben, und es ist offensichtlich falsch ...

public class CourseRecipeChoiceConfiguration : EntityTypeConfiguration<CourseRecipeChoice> 
{ 
    public CourseRecipeChoiceConfiguration() 
    { 
     HasKey(crc => new { crc.Id}); 
     HasRequired(r => r.Recipe).WithMany(crc => crc.CourseRecipeChoices).HasForeignKey(crc => crc.RecipeId); 
     HasRequired(m => m.MenuCourse).WithMany(crc => crc.CourseRecipeChoices).HasForeignKey(crc => crc.MenuCourseId); 
     HasRequired(m => m.MenuCourse).WithMany(crc => crc.CourseRecipeChoices).HasForeignKey(crc => crc.SuggestedMenu_MenuCourseId); 
    } 
} 

Was für die Navigationseigenschaften und die korrekte Syntax für fließend api Syntax für die CourseRecipeChoice die korrekte Syntax ist Join-Tabelle ?

public class SuggestedMenu 
{ 
    public int SuggestedMenuId { get; set; } 

    public virtual ICollection<MenuCourse> MenuCourses { get; set; } 
} 

public class MenuCourse 
{ 
    public int Id { get; set; } 
    public int SuggestedMenuId { get; set; } 

    public SuggestedMenu SuggestedMenu { get; set; } 
    public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 

public class CourseRecipeChoice 
{ 
    public int SuggestedMenuId { get; set; } 
    public int MenuCourseId { get; set; } 
    public int Id { get; set; } 
    public int RecipeId { get; set; } 

    //How do I represent the navigation properties in this class? 

} 

public class Recipe 
{ 
    public int RecipeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 

Die Tasten sind wie folgt:

  • SuggestedMenu (Id)
  • MenuCourse (Id, SuggestedMenuId)
  • CourseRecipeChoice (Id, SuggestedMenuId, MenuCourseId, RecipeId) // Das ist eigentlich, wo ich verwirrt werde, da SuggestedMenuId laut SugaredM ein PK ist enu und ein PF in MenuCourse und CourseRecipeChoice (könnte dies nur schlechtes Design sein?)
  • Rezept (RecipeId)
+0

Könnten Sie mir nur sagen, was sind die Schlüssel für jede Tabelle und was sind die Fremdschlüssel, vermute ich aber nicht sicher. Mit sollte es keine größeren Probleme geben, denke ich. – NSGaga

+0

@NSGaga Ich habe Ihre Antwort noch zu lesen, aber ich habe die Frage aktualisiert, um die Schlüssel hinzuzufügen ... – Robert

Antwort

15

... auf der Grundlage der Informationen zur Hand (Schlüssel, sind Beziehungen nicht ganz klar) ,
hier ist das komplexeste Szenario und decken sollte, was Sie vielleicht habe ich glaube, ...

public class SuggestedMenu 
{ 
    public int SuggestedMenuId { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<MenuCourse> MenuCourses { get; set; } 
    // public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 
public class MenuCourse 
{ 
    public int MenuCourseId { get; set; } 
    public int SuggestedMenuId { get; set; } 
    public SuggestedMenu SuggestedMenu { get; set; } 
    public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 
public class CourseRecipeChoice 
{ 
    public int CourseRecipeChoiceId { get; set; } 
    public int MenuCourseId { get; set; } 
    public int SuggestedMenuId { get; set; } 
    public int RecipeId { get; set; } 
    // no virtuals if required, non-optional 
    public Recipe Recipe { get; set; } 
    public MenuCourse MenuCourse { get; set; } 
    // public SuggestedMenu SuggestedMenu { get; set; } 
} 
public class Recipe 
{ 
    public int RecipeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<CourseRecipeChoice> CourseRecipeChoices { get; set; } 
} 

... und in OnModelCreating (ich ziehe es alle Konfigurations es getan, obwohl es die gleiche ist) ..

modelBuilder.Entity<CourseRecipeChoice>() 
    .HasKey(crc => new { crc.CourseRecipeChoiceId, crc.SuggestedMenuId, crc.MenuCourseId, crc.RecipeId }); 

modelBuilder.Entity<CourseRecipeChoice>() 
    .HasRequired(r => r.Recipe) 
    .WithMany(crc => crc.CourseRecipeChoices) 
    .HasForeignKey(crc => crc.RecipeId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<CourseRecipeChoice>() 
    .HasRequired(m => m.MenuCourse) 
    .WithMany(crc => crc.CourseRecipeChoices) 
    .HasForeignKey(crc => new { crc.MenuCourseId, crc.SuggestedMenuId }) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<SuggestedMenu>() 
    .HasKey(crc => crc.SuggestedMenuId); 

modelBuilder.Entity<MenuCourse>() 
    .HasKey(crc => new { crc.MenuCourseId, crc.SuggestedMenuId }); 

modelBuilder.Entity<MenuCourse>() 
    .HasRequired(m => m.SuggestedMenu) 
    .WithMany(crc => crc.MenuCourses) 
    .HasForeignKey(crc => crc.SuggestedMenuId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Recipe>() 
    .HasKey(crc => crc.RecipeId); 

... und um z.B. so etwas wie ...

 using (var db = new YourDbContext()) 
     { 
      SuggestedMenu suggestedmenu = new SuggestedMenu { Description = "suggested menu" }; 
      var menucourse = new MenuCourse { MenuCourseId = 2, SuggestedMenu = suggestedmenu }; 
      var recipe = new Recipe { Name = "My recipe", Description = "recipe desc" }; 
      var crc = new CourseRecipeChoice { CourseRecipeChoiceId = 2, MenuCourse = menucourse, Recipe = recipe, }; 
      db.CourseRecipeChoices.Add(crc); 
      int recordsAffected = db.SaveChanges(); 
      foreach (var crcs in db.CourseRecipeChoices.Include(c => c.MenuCourse).Include(c => c.Recipe)) 
      { 
       Console.WriteLine("{0}, {1}, {2}, {3}", crcs.MenuCourse.MenuCourseId, crcs.MenuCourse.SuggestedMenuId, crcs.Recipe.Name, crcs.Recipe.Description); 
      } 
     } 
+0

Ich werde dies eine Chance geben und melden Sie so bald wie möglich. – Robert

+0

Es hat perfekt funktioniert! Danke, dass du mir heute hilfst, etwas Neues zu lernen! – Robert

+0

np wenn das gelöst ist, kannst du die Antwort markieren/upvoten, am besten – NSGaga