2016-02-26 117 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; }