1

我有兩個類:實體框架:如何創建具有相同的對象雙重關係(1-1和許多-1)

class Sub 
{ 
    public Guid Id { get; set; } 
    public DateTime ValidDate { get; set; } 
    public Guid MasterId { get; set; } 
    public Master Master { get; set; } 
} 

class Master 
{ 
    public Guid Id { get; set; } 
    public int Data { get; set; } 

    public ICollection<Sub> Subs { get; set; } 
    public Sub MainSub { get; set; } 
} 

簡單,高手有一個主要的子集來定義它,並且可以有0個或更多的「次要」子集。 我試着做映射這樣

var mBuilder = modelBuilder.Entity<Master>(); 
mBuilder.HasMany(m => m.Subs).WithOne(m => m.Master).HasForeignKey(m => m.MasterId); 
mBuilder.HasOne(m => m.MainSub).WithOne(m => m.Master); 

但我預期(「主不能參加兩個關係」)的異常。我不想改變我的模型,因爲它適合我需要的東西,我該如何執行這樣的映射?

+0

想想你將如何在SQL中建模。無法用一個FK完成。 –

回答

1

您無法映射此關係。每個關係都有2個端點,並且類中的一個複雜屬性不能成爲2個關係的端點。

我會創造我Subbool? IsMainSub財產並以我Sub類創建MasterIdIsMainSub唯一鍵約束。這將確保Master記錄不能有2個主Sub記錄。

UPDATE - 我知道這看起來並不完善,IsMainSub屬性將只允許值truenull自整定值false將觸發違反唯一約束。這是邏輯,您可以添加到您的屬性設置器採取任何false值並將其轉換爲空。

我記得,您可以創建一個唯一的鍵約束,允許某些列的值爲null而不違反約束。我會仔細檢查這一點。

+0

感謝您的回答。實際上,我寧願讓我的MainSub在記憶中保持純粹的概念,在訪問和保存單個關係時從集合中提取它。從數據庫的角度來看,我無法斷言我有一個mainSub定義,但它足夠好。如果我必須實施解決方案,那麼您的解決方案似乎是正確的,因此我會將其標記爲答案 – cdie

相關問題