2012-08-31 60 views
1

我試圖讓Entity Framework以特定的1對1關係的某種方式創建表。由實體框架創建的自定義1對1關係

比方說,我有這樣的組類:

public class Parent 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public Child XYZ { get; set; } 
} 

public class Child 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
    public string Property3 { get; set; } 
} 

Parent類的XYZ屬性可能被設置爲Child一個實例。我希望EF爲這兩個類中的每一個創建一個表,Child對象的表應該只有一個外鍵列,最好名爲「ParentID」,以保持與Parent對象的關係。

我不想在Parent表中添加一個「ChildID」列,而且我也不想爲Child類添加一個ID或ParentID屬性。

當前,Child對象的屬性創建爲父表中的列,並且如果XYZ屬性未設置爲Child類的實例(即,它不能爲空),則會發生異常。

我試圖用DbModelBuilder和OnModelCreating事件來做到這一點。 IsOptional method只適用於簡單的類型。

有什麼建議嗎? EF甚至有可能嗎?

回答

2

目前,子對象的屬性在父表中的列 創建,我得到一個異常,如果XYZ屬性不 設置爲一個子類的實例,即它不能爲空。

是因爲目前你Child是一個複雜的類型(值對象),並必須始終設置(它是實體的一部分,實體不無該部分存在),它不能爲空。如果複雜類型的內容是可選的,則必須在子項的屬性上執行此操作,而不是在Child本身上。

我不想將一個ID或ParentID屬性添加到Child類。

如果你想有Child映射到單獨的表必須有ID因爲每個實體必須有主鍵。該ID也將被用來作爲外鍵Parent達到一到一個關係:

public class Child 
{ 
    public int Id { get; set; } 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
    public string Property3 { get; set; } 
} 

而且關係映射:

modelBuilder.Entity<Parent>() 
      .HasOptional(p => p.XYZ) 
      .WithRequired(); 
+0

謝謝。我想我必須咬緊牙關併爲我的Child類添加一個ID屬性。 :) –

1

實體框架要求1-1的關係,以共享同樣的主鍵,這意味着您的孩子必須擁有父母的外鍵,並且該字段也必須是孩子的主鍵。

你可能不喜歡那樣,但是EF不會以其他方式工作。所以要麼接受它,要麼繼續,要麼找到一個不同的框架。

+0

嗯,我想我不能擁有一切。 :) EF非常酷,我應該停止浪費我的時間,並就我應該如何創建表格發表自己的看法。 –