2012-04-14 18 views
6

Tengo cuatro entidades que me gustaría traducir a las tablas de la base de datos a través del código de la primera API (estoy usando un modelo encontrado en databaseanswers.org), pero estoy no estoy seguro de cómo. El problema que tengo es que SuggestedMenuId se está migrando a través de dos tablas diferentes en una clave compuesta (MenuCourse y CourseRecipeChoice).Code First Fluent API y Navigation Properties en Join Table

Este es el mensaje que estoy recibiendo:

"Se detectaron uno o más errores de validación durante la generación del modelo:

\ tSystem.Data.Entity.Edm.EdmAssociationConstraint:: El número de propiedades en el Las funciones dependientes y principales en una restricción de relación deben ser idénticas ".

Esto es lo que he probado en mi clase EntityTypeConfiguration y es obviamente incorrecto ...

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

¿Cuál es la sintaxis correcta para las propiedades de navegación y la sintaxis correcta para Sintaxis de la API fluidez de los CourseRecipeChoice tabla de unión ?

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

las claves son como sigue:

  • SuggestedMenu (Id)
  • MenuCourse (Id, SuggestedMenuId)
  • CourseRecipeChoice (Id, SuggestedMenuId, MenuCourseId, RecipeId) // aquí es donde me confundo porque según el modelo, SuggestedMenuId es un PK en SuggestedM ENU y PF en MenuCourse y CourseRecipeChoice (este podría ser sólo un mal diseño?)
  • Receta (RecipeId)
+0

Podría decirme cuáles son las claves de cada tabla y cuáles son las claves externas, supongo, pero no estoy seguro. Con eso no deberían haber problemas mayores, creo. – NSGaga

+0

@NSGaga Todavía tengo que leer su respuesta, pero actualicé la pregunta para agregar las claves ... – Robert

Respuesta

15

... en base a la información a la mano (llaves, las relaciones no están del todo claras) ,
aquí es el escenario más complejo y debe cubrir lo que es posible que tenga que pienso ...

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

... y en OnModelCreating (lo prefiero toda config hecho allí, aunque es lo mismo) ..

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

... y para probar, p. algo así como ...

 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

Le daré una oportunidad e informaré lo antes posible. – Robert

+0

¡Funcionó perfectamente! ¡Gracias por ayudarme a aprender algo nuevo hoy! – Robert

+0

np si eso se soluciona, puede marcar/votar la respuesta, mejor – NSGaga

Cuestiones relacionadas