2016-02-26 94 views
1

这是怎样的代码看起来像:实体框架代码首先初始化外键

public class Family 
{ 
    public int FamilyID { get; set; } 
    public virtual ICollection<Member> 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() { } 
} 

因此,有会员和自行车之间的一到一个relantionship,并有一个一对多的关系家庭与会员之间。 我的问题是:我怎么初始化使用我的背景下,这些外键?互联网上的所有教程都说明了如何定义,但现在如何初始化它们。难道我只是为它们分配一个正确的int值或者我将它们分配一个整体对象,如果是这样,我怎么做呢?使用LINQ?

@Edit: 假设有2个科:史密斯和约翰逊。史密斯有3名成员:本,艾米,布莱恩。约翰逊有2名成员:约翰和娜塔莉。我如何初始化我的代码中的所有内容?

+0

你的配置应该有你的主键设置作为'DatabaseGeneratedOption.Identity'。然后,当您保存对象时,将自动设置ID,然后在设置这些对象时设置FK ID。 – krillgar

+0

但是,我如何初始化这些FK?假设有2个家庭:史密斯和约翰逊。史密斯有3名成员:本,艾米,布莱恩。约翰逊有2名成员:约翰和娜塔莉。我如何初始化我的代码中的所有内容? – Amai

回答

1

首先,解决这个问题:

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

这应该是足够的配置关系。 EF将按照惯例制定密钥身份。

您可以分配关系的多种方式。你可以明确地设置FK ID如果将它们添加到您的模型,也可以使用导航性能是这样的:

var family = new Family { LastName = "Smith", ...}; 
List<Member> members = new List<Member> 
{ 
    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/blogs/scott/archive/2011/11/28/composing-entity-framework-fluent-configurations.aspx

你其实可以有EF使用此处描述的技术自动找到你的流利代码:https://msdn.microsoft.com/en-us/magazine/dn519921.aspx

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

public class Family 
{ 
    public Family() 
    { 
     FamilyMembers = new HashSet<Member>(); 
    } 

    public int FamilyID { get; set; } 
    public virtual ICollection<Member> FamilyMembers { get; set; } 
} 
+0

谢谢,这回答我的问题只是我想要的方式。虽然有一些新问题,但如果您愿意回答: 首先,FamilyFK - 我知道这不是必需的,但它允许我为FK设置一个自定义名称。这样做还不好吗?我应该使用DataAnnotations还是Fluent API? 而且,由于您通过使用列表添加成员,所以这意味着: - 我可以在构造函数中将FamilyMembers定义为List('New List ()')? - 我必须有一个将FK添加到列表的方法,以及删除它们的方法? – Amai

+0

请参阅我编辑的答案。您可以通过列表或一次添加一个家庭成员。 family.FamilyMembers.Add(mySingleFamilyMember); –

+0

对不起,这样打扰你,但我完全停留在我昨天问的另一个问题上,哪个人似乎没有能力帮助我,甚至没有找到任何材料或参考资料,所以我想也许你可以看看你是否知道如何解决这个问题。再次抱歉,如果这让你感到困扰。 http://stackoverflow.com/questions/35746496/entity-framework-code-first-unique-index-foreign-key-throws-dbupdate-exception – Amai

0

你并不需要明确界定家庭和会员之间的外键。如果您需要,实体框架将为您提供帮助。因为您已经声明此属性

public virtual ICollection<Member> FamilyMembers { get; set; } 

在Family类上,外键是在初始Add-Migration或Update-database过程中创建的。所以,你不需要财产

public virtual FamilyFK { get; set; } 
相关问题