2012-08-03 22 views
0

鑑於我有兩個實體:DeputyDeputyProfile從兒童或從實體框架代碼優先父導航性能

public class Deputy : IdableEntity 
{ 
    [Required] 
    public string FirstName { get; set; } 

    public string Patronimic { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

public class DeputyProfile : IdableEntity 
{ 
    [Required] 
    public string Dosieur { get; set; } 
} 

是在它們之間建立一個一對一關係的最佳途徑是通過把從副檔案到副檔案(從孩子到父母)還是簽證?

它應該是這個樣子?:

public class DeputyProfile : IdableEntity 
{ 
    [Required] 
    public virtual Deputy Deputy{ get; set; } 

    [Required] 
    public string Dosieur { get; set; } 
} 

什麼是合乎邏輯的規則基礎上,它是最好的做出這樣的決定?

P.S.作爲IdableEntity的孩子給了一個自己的Guid Id字段。

回答

0

您必須爲任何關係選擇一個主體(父)端和一個從屬(子)端。你可以自由選擇你最喜歡的任何一個。對我來說,副主席似乎是明確的委託人,因爲隨着你的模型的發展,它可能會有更多的關係。

一對一關係由共享主鍵實現;副檔案必須具有副檔案的主要關鍵字。這將使你的代碼是這樣的:

public class Deputy 
{ 

    public int ID {get;set;} 

    public int ProfileID {get;set;} 
    public virtual DeputyProfile Profile {get;set;} 

    [Required] 
    public string FirstName { get; set; } 

    public string Patronimic { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

public class DeputyProfile 
{ 
    public int DeputyID {get;set} 
    public virtual Deputy Deputy {get;set} 

    [Required] 
    public string Dosieur { get; set; } 
} 

注意:因爲它現在執行每個副手必須有一個配置文件。如果配置文件是可選的,則使ProfileID爲'int?'。

我非常樂意推薦this excellent series of blogs有關實現實體框架4.1的關係和較高的

+0

謝謝,我用的GUID ID,但不會使這裏的任何區別,我想。只是爲了確保 - 在你的答案中,我看到兩個班級都「意識到」對方並且可以相互參照。這是否是唯一的方法,或者我的方法(似乎更簡單)也可以在DbContext中工作,如果我爲DbContext和DeputyProfile定義了DbSets?因爲兩者都是IdableEntity的孩子 - 都繼承了Guid Id字段。 – 2012-08-03 22:44:17

+0

@ MaximV.Pavlov 1.使用GUID很好。 2.如果依賴實體擁有自己的密鑰,則該關係變爲多對多。雙方都不需要實現導航屬性。 3.不要只爲一個ID從基類派生所有的類。它將爲您的所有課程創建一個大型表格:每個層次結構的表格。查看我上面提到的一系列博客。 – Dabblernl 2012-08-04 03:07:09