2013-12-23 43 views
1

我有一個實體(A),它將數據存儲在自己的表中。我想讓這個實體成爲另一個實體(B)的一個屬性,但將它的所有數據存儲在Entity B的表中(有點像複雜類型),這樣我就可以在那個時候寫出實體的確切值。使用實體作爲財產,但使其成爲一個複雜的類型

我已經嘗試過自己做這件事,但實體B總是將實體A作爲外鍵,即使該屬性不是虛擬的,我也嘗試過繼承哪個不能正常工作。我可以將實體A的類型完全複製並分配給它來解決它,但我是一個很大的DRY粉絲,並且覺得它會增加不必要的複雜性。

在此先感謝

編輯:代碼下面,我不能發佈的原始代碼,但這裏有一個什麼樣子

public class EntityA { 

    [Key] 
    public int id { get; set; } 

    public int prop1 { get; set; } 

    public virtual AnotherEntity { get; set; } 
} 


public class EntityB { 

    // foreign key as part of composite key 
    // entity C code not included as doesn't 
    // affect the problem 
    [Key, Column(Order=0)] 
    public int EntityCId { get; set; } 

    public virtual EntityC { get; set; } 

    // this is set as part of the composite key 
    // as I want to use entity ID but 
    // not make the field foreign key 
    [Key, Column(Order=1)] 
    public EntityA saveInToEntityBTable { get; set; }  

} 
+1

我們可以看到一些代碼嗎? – Zach

+0

@Zach添加了一些示例代碼,歡呼聲。 – Barry

回答

0

解決它的味道,你必須做的是抽象的一個可以繼承的基類。由於基類是抽象的,它永遠不會創建表,因此繼承類沒有外鍵可以鏈接到它。

public class EntityA : EntityABase { 


} 

public abstract class EntityABase { 

    [Key] 
    public int id { get; set; } 

    public int prop1 { get; set; } 

    public virtual AnotherEntity { get; set; } 
} 

public class EntityB : EntityABase { 

    [Key] 
    public virtual EntityC { get; set; } 

} 

注意:您可以使用TPC(每個具體類型表),如果你不希望使用一個抽象類,但是我已經和財產上EntityB遷移而不是創建該列或外鍵「AnotherEntity」問題(實體A創建它們就好)

+1

在旁註中,我會調用複雜類型類**快照以便不與實體混合。例如ProductSnapshot如果在訂單詳細信息上使用此方法,例如 –

+0

是的,這絕對是一種好的做法 – Barry

相關問題