2011-10-13 95 views
1

說我有以下POCO類:EF代碼第一單向一對一許多與數據註釋

public class Parent 
{ 
    public int ID { get; set; } 
} 

public class Child 
{ 
    public int ID { get; set; } 

    public int MyParentID { get; set; } 

    [ForeignKey("MyParentID")] 
    public Parent MyParent { get; set; } 
} 

Child.MyParent屬性映射到Parent表有一個一對多的關係,但我不不希望Parent類知道關聯(單向)。我可以DbContext.OnModelCreating(或其任何等價物)與下列內做到這一點:

modelBuilder.Entity<Child>() 
    .HasRequired(c => c.MyParent) 
    .WithMany() 
    .HasForeignKey(c => c.MyParentID); 

但是,我似乎無法找到與數據註解相同。有這樣的事嗎?該ForeignKey註釋我使用似乎需要雙向性,因爲它給我的「無法確定關聯的主要結束」異常,直到我上了Parent類添加一個ICollection<Child>財產

UPDATE 此代碼實際上應該按原樣工作。我試圖在代碼中分離的問題實際上並未涉及此設置。我發佈了一個關於我的問題here的新問題。

+0

你什麼時候得到這個異常?當EF構建模型或添加/更新實體時?在SaveChanges()'期間會發生嗎? – Slauma

回答

2
public class Child 
{ 
    public int ID { get; set; } 
    [ForeignKey("Parent")] 
    public int ParentID { get; set; } 
    public Parent Parent { get; set; } 
} 

應該工作。實際上,您不需要做任何事情 - 無論是在Fluent API中還是在註釋中 - 因爲EF約定會自動創建您在Fluent API中定義的關係。外鍵將被檢測到,因爲它具有名稱模式[Navigation property]Id,由於FK是非空的,並且它將是一對多的,所以該關係將是「需要的」,因爲您在一側具有單個參考(Parent),並且如果沒有相應的導航屬性,則另一方的「許多」是默認的。

+0

感謝您的回覆......這讓我意識到,我對這個問題的框架過於籠統。我遇到的問題與「Parent」引用的「Child」類有關,這違反了約定。我相應地更新了我的問題。抱歉! –

+0

@DMactheDestroyer:但您的更新代碼仍然遵循約定。它的工作原理沒有任何註釋和流利的代碼,也與你在問題中顯示的FK註釋(我剛測試過)相同。這種例外情況對這種模式沒有意義。 「Parent」類是否還有其他內容,對單個「Child」而不是集合的引用? – Slauma

+0

我已經發現了我的特定問題的來源,並且與此無關。我已經在新問題中發佈了一個關於我的實際問題的鏈接,作爲此問題的更新。謝謝你的幫助! –