2012-04-14 11 views
6

Ho quattro entità che vorrei tradurre in tabelle di database tramite codice prima api fluente (sto usando un modello trovato su databaseanswers.org), ma io sono non certo su come. Il problema che sto avendo è che SuggestedMenuId viene migrato su due diverse tabelle in un tasto Composite (MenuCourse e CourseRecipeChoice).Codice First Fluent API e proprietà di navigazione in una tabella Join

Ecco il messaggio che sto ricevendo:

"sono stati rilevati uno o più errori di convalida durante la generazione del modello:

\ tSystem.Data.Entity.Edm.EdmAssociationConstraint:: Il numero di proprietà del I ruoli dipendenti e principali in un vincolo di relazione devono essere identici. "

Ecco quello che ho provato nella mia classe EntityTypeConfiguration ed è, ovviamente, non corretta ...

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); 
    } 
} 

Qual è la sintassi corretta per le proprietà di navigazione e la sintassi corretta per la sintassi api fluente per i CourseRecipeChoice unirsi a tavola ?

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; } 
} 

I tasti sono i seguenti:

  • SuggestedMenu (Id)
  • MenuCourse (Id, SuggestedMenuId)
  • CourseRecipeChoice (Id, SuggestedMenuId, MenuCourseId, RecipeId) // questo è in realtà dove mi confondo perché secondo il modello, SuggestedMenuId è un PK in SuggestedM enu e un PF in MenuCourse e CourseRecipeChoice (questo potrebbe essere solo il cattivo design?)
  • Ricetta (RecipeId)
+0

Potresti dirmi quali sono le chiavi per ogni tavolo e quali sono le chiavi esterne, immagino ma non sono sicuro. Con non dovrebbero esserci problemi più grandi, penso. – NSGaga

+0

@NSGaga Devo ancora leggere la tua risposta, ma ho aggiornato la domanda per aggiungere le chiavi ... – Robert

risposta

15

... sulla base di informazioni a portata di mano (chiavi, relazioni non sono del tutto chiare) ,
qui è lo scenario più complesso e dovrebbe coprire quello che si potrebbe avere penso ...

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; } 
} 

... e in OnModelCreating (io preferisco tutto config fatto lì, anche se è lo stesso) ..

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); 

... e per testare ad es. qualcosa di simile ...

 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

Darò uno scatto e riporto al più presto. – Robert

+0

Ha funzionato perfettamente! Grazie per avermi aiutato a imparare qualcosa di nuovo oggi! – Robert

+0

np se è stato risolto, è possibile contrassegnare/alzare la risposta, meglio – NSGaga