entity framework代码首先初始化外键

这是代码的样子:

public class Family { public int FamilyID { get; set; } public virtual ICollection FamilyMembers { get; set; } } public class Member { public int MemberID { get; set; } public virtual Family Family { get; set; } } public class Bicycle { public int BicycleID { get; set; } public virtual Member Owner { get; set; } } public class MyContext : DbContext { public MyContext : base () { } } 

因此,会员与自行车之间存在一对一的关系,家庭与会员之间存在一对多的关系。 我的问题是:如何使用我的上下文初始化这些外键? 互联网上的所有教程都说如何定义,但现在如何初始化它们。 我只是为它们分配一个正确的int值,还是为它们分配一个完整的对象,如果是这样,我该怎么做? 使用LINQ?

@Edit:假设有两个家庭:史密斯和约翰逊。 史密斯有3名成员:Ben,Amy,Brian。 约翰逊有2名成员:约翰和娜塔莉。 如何在我的代码中初始化所有内容?

首先,解决这个问题:

 public class Member { public int MemberID { get; set; } public virtual Family Family { get; set; } } 

这应该足以配置关系。 EF将按惯例制作密钥标识。

您可以通过多种方式分配关系。 如果将它们添加到模型中,则可以显式设置FK ID,或者可以使用如下导航属性:

 var family = new Family { LastName = "Smith", ...}; List members = new List { new Member(){ Name = "Ben", ... }, new Member(){ Name = "Amy", ... }, new Member(){ Name = "Brian", ... } }; family.FamilyMembers = members; context.Family.Add(family); context.SaveChanges(); 

要将自行车分配给所有者:

 var owner = context.Members.Find(ownerId); var bike = new Bicycle { Make = "ACME", Model = "XXXX", Owner = owner }; context.Bicycles.Add(bike); context.SaveChanges(); 

编辑:是的,肯定允许将FK添加到您的模型中。 这是我使用的方法。 喜欢这段代码:

 public class Member { public int MemberID { get; set; } public int FamilyID { get; set; } // EF will automatically make this a FK by convention public virtual Family Family { get; set; } } 

如果您不遵守约定或者为了文档而需要它们,则需要添加注释:

 public class Member { public int MemberID { get; set; } public int FamilyID { get; set; } [ForeignKey("FamilyID")] public virtual Family Family { get; set; } } 

见http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

我更喜欢流利的api。 它使我的模型更清洁,并将问题分开。 对于简单的项目,您可以在上下文中的OnModelCreating()覆盖中添加所有流畅的代码,但我更喜欢将我的实体配置存储在我的上下文下的文件夹中(每个实体一个文件),如下所述: http:// odetocode。 COM /博客/斯科特/存档/ 2011/11/28 /人组成的entity framework流利,configurations.aspx

实际上,您可以使用此处描述的技术让EF自动查找您的流畅代码: https : //msdn.microsoft.com/en-us/magazine/dn519921.aspx

关于子集合,是的,你可以在构造函数中新建它:

 public class Family { public Family() { FamilyMembers = new HashSet(); } public int FamilyID { get; set; } public virtual ICollection FamilyMembers { get; set; } } 

您不需要在Family和Member之间明确定义外键。 如果您需要,entity framework将为您解决此问题。 因为你已经说明了这个属性

 public virtual ICollection FamilyMembers { get; set; } 

在Family类上,在初始Add-Migration或Update-database期间创建Foreign键。 所以你不需要这个属性

 public virtual FamilyFK { get; set; }