【发布时间】:2012-07-08 03:03:21
【问题描述】:
从我在网上和编程实体框架 CodeFirst 书中看到的示例中,当您在两个类上都有一个集合时,EF 将创建一个映射表,例如 MembersRecipes,并且每个类的主键将链接到该表.
但是,当我执行以下操作时,我会在 Recipes 表中获得一个名为 Member_Id 的新字段,并在 Members 表中获得一个 Recipe_Id。
这只会创建两个一对多关系,而不是多对多关系,因此我可以将成员 3 链接到食谱 (4,5,6) 并将食谱 4 链接到成员 (1,2,3 ) 等。
有没有办法创建这个映射表?如果是这样,您如何将其命名为其他名称,例如“食谱”?
谢谢
public abstract class Entity {
[Required]
public int Id { get; set; }
}
public class Member : Entity {
[Required]
public string Name { get; set; }
public virtual IList<Recipe> Recipes { get; set; }
}
public class Recipe : Entity {
[Required]
public string Name { get; set; }
[ForeignKey("Author")]
public int AuthorId { get; set; }
public virtual Member Author { get; set; }
....
public virtual IList<Member> Members { get; set; }
}
更新:
下面是我尝试过的另一种方法,它不使用 Fluent API 并用所有者标志替换 Recipe 上的 AuthorId 和 Author,我还将下面的示例从 Cookbooks 重命名为 MembersRecipes,这也解决了我的问题,类似于答案,但如上所述有进一步的含义。
public class MembersRecipes {
[Key, Column(Order = 0)]
[ForeignKey("Recipe")]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
[Key, Column(Order = 1)]
[ForeignKey("Member")]
public int MemberId { get; set; }
public virtual Member Member { get; set; }
public bool Owner { get; set; }
}
在 Recipe 和 Member 类中,我将集合更改为
public virtual IList<MembersRecipes> MembersRecipes { get; set; }
【问题讨论】:
-
关于您的更新,在实体框架的说法中,多对多方法称为 带有有效负载的多对多映射 我不知道他们为什么提出一个非常花哨的术语(有效载荷);或者只是我,我的母语不是英语 :-) 我通常将有效载荷这个词与计算机病毒相关联。在 EF 中,有效负载并不是什么险恶的东西,您可以通过使您的表成为有效负载就绪的实体(例如,通过添加额外的 ID 作为主键,因此您需要将现有的多对多复合 pk 转换为独特的复合列)从一开始就
-
在您的情况下,您没有添加额外的 ID,而是维护了复合主键。表上的 Owner 标志是有效载荷
-
@MichaelBuen 有效载荷是指映射表(关系),您可以在其中放置额外数据(例如关系的创建日期)。如果您应该将 EF 多对多与隐藏表一起使用,则无法将有效负载添加到关系中
-
对我来说,当我遇到这个问题时,这是因为我的导航属性之一是
List,另一个是IEnumerable。我将它们都更改为列表,然后Add-Migration开始生成 XR 表,而不仅仅是 FK 属性。
标签: c# entity-framework ef-code-first many-to-many