Entity framework 在联接表中首先编码Fluent API和导航属性

Entity framework 在联接表中首先编码Fluent API和导航属性,entity-framework,code-first,composite-key,jointable,Entity Framework,Code First,Composite Key,Jointable,我有四个实体,我想通过CodeFirstFluentAPI将它们转换成数据库表(我使用的是databaseanswers.org上的模型),但我不确定如何转换。我遇到的问题是SuggestedMenuId在一个复合键(MenuCourse和CourseRecipeChoice)中跨两个不同的表迁移 以下是我得到的信息: “在模型生成过程中检测到一个或多个验证错误: \tSystem.Data.Entity.Edm.edmsociationConstraint::关系约束中从属角色和主体角色中的属

我有四个实体,我想通过CodeFirstFluentAPI将它们转换成数据库表(我使用的是databaseanswers.org上的模型),但我不确定如何转换。我遇到的问题是SuggestedMenuId在一个复合键(MenuCourse和CourseRecipeChoice)中跨两个不同的表迁移

以下是我得到的信息:

“在模型生成过程中检测到一个或多个验证错误:

\tSystem.Data.Entity.Edm.edmsociationConstraint::关系约束中从属角色和主体角色中的属性数必须相同。”

这是我在EntityTypeConfiguration类中尝试的内容,显然是不正确的

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);
    }
}
公共类课程RecipechoiceConfiguration:EntityTypeConfiguration
{
公共课程RecipechoiceConfiguration()
{
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\u MenuCourseId);
}
}
导航属性的正确语法和CourseRecipeChoice联接表的fluent api语法的正确语法是什么

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; }
}
公共类建议菜单
{
public int SuggestedMenuId{get;set;}
公共虚拟ICollection菜单课程{get;set;}
}
公共类菜单课程
{
公共int Id{get;set;}
public int SuggestedMenuId{get;set;}
公共建议菜单建议菜单{get;set;}
公共虚拟ICollection CourseRecipeChoices{get;set;}
}
公共课
{
public int SuggestedMenuId{get;set;}
public int MenuCourseId{get;set;}
公共int Id{get;set;}
public int RecipeId{get;set;}
//如何表示此类中的导航属性?
}
公共课食谱
{
public int RecipeId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共ICollection CourseRecipeChoices{get;set;}
}
关键点如下:

  • 建议菜单(Id)
  • 菜单课程(Id,SuggestedMenuId)
  • CourseRecipeChoice(Id,SuggestedMenuId,MenuCourseId,RecipeId)//这实际上是我感到困惑的地方,因为根据模型,SuggestedMenuId是SuggestedMenus中的PK,是MenuCourse和CourseRecipeChoice中的PF(这可能是糟糕的设计吗?)
  • 配方(RecipeId)

…根据手头的信息(钥匙、关系不完全清楚),
这是最复杂的场景,应该涵盖你可能拥有的我认为

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; }
}
…并进行测试,例如

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

你能告诉我每张桌子的键是什么吗?外键是什么?我猜,但不确定。“我认为应该没有更大的问题了。@NSGaga我还没有阅读您的回答,但我确实更新了问题,添加了关键点……我会尝试一下,并尽快报告。效果非常好!”!谢谢你今天帮我学习新东西!完成!我走出办公室回来,因为我忘了这么做:)
        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);
            }
        }