Entity framework 在联接表中首先编码Fluent API和导航属性
我有四个实体,我想通过CodeFirstFluentAPI将它们转换成数据库表(我使用的是databaseanswers.org上的模型),但我不确定如何转换。我遇到的问题是SuggestedMenuId在一个复合键(MenuCourse和CourseRecipeChoice)中跨两个不同的表迁移 以下是我得到的信息: “在模型生成过程中检测到一个或多个验证错误: \tSystem.Data.Entity.Edm.edmsociationConstraint::关系约束中从属角色和主体角色中的属性数必须相同。” 这是我在EntityTypeConfiguration类中尝试的内容,显然是不正确的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::关系约束中从属角色和主体角色中的属
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);
}
}