2014-05-07 16 views
0

更新: 決定重寫問題,因爲它不是很清楚。EF代碼第一個包裝容器類沒有定義密鑰

如果我有類A並給它一個無鍵類B的引用,而不是類B轉換成它自己的表,它的所有列將顯示在類A的表上 - 這就是我想要的。 但是現在我想讓B持有對C類的引用,C類具有自己的表和鍵。我現在所期望的是,表A顯示B的屬性並保存C的鍵。但是當我添加這個引用時,它告訴我B沒有定義鍵,所以它不起作用。

public class A 
{ 
    [Key] 
    public virtual int AId { get; set; } 
    public virtual B b{ get; set; } 
} 

public class B 
{ 
    public bool Fixed { get; set; } 
    public virtual C c{ get; set; } 
} 

public class C 
{ 
    [Key] 
    public virtual int CId { get; set; } 
} 

的茶几應該如何看實例:

[AId] 
     ,[Fixed] 
     ,[CId] 
     FROM [A] 

我有一種感覺,這是一個非常基本的問題,但我找不到任何地方的答案。我錯過了什麼讓這項工作按需要?

回答

0

您可以將您的結束表定義爲視圖。如果你使用這種方法B就還需要定義鍵,然後創建一個實體像一個觀點:

public class ABCView 
{ 
    public virtual int AId { get; set; } 
    public bool Fixed { get; set; } 
    public virtual int CId { get; set; } 
} 

你需要創建一個類似的觀點:

string script = 
@" 
CREATE VIEW dbo.ABCView 
AS SELECT a.AId,b.Fixed,c.CId 
FROM dbo.a a 
LEFT JOIN dbo.b b ON a.b_BId = b.BId 
LEFT JOIN dbo.c c ON b.c_CId = c.CId"; 

db.Database.ExecuteSqlCommand(script); 

然後加載的觀點一樣, :

var abcItem = db.Database.SqlQuery<ABCView>("Select * from dbo.ABCView").FirstOrDefault(abc => abc.AId == 1); 

在我使用的1個

+0

感謝您的響應藉助於上述示例。我從一個NHibernate項目轉換而來,這個項目能夠在沒有你建議的方法的情況下使用,只使用原始實體。這僅僅是EF6的限制嗎?我一直沒有成功地確定NH的設置是否可以正常工作,但是我會繼續研究如果解決方案能夠解決EF6中的問題。這是一個大型項目,我不希望將它全部轉換爲您的建議方法! – DBHC

+0

我聽到你在說什麼,但是你正在描述的概念 - 「結束表」是一個數據庫視圖 - 並首先使用ef代碼我正在查看一個wAy來構建視圖 – ozidom

+0

我想將來自B的數據存儲在它自己的表並獲得關鍵參考將是轉換此項目最不具破壞性的方式。我只是感到驚訝,沒有更清潔的解決方案,因爲它是一個相對常見的情況 - 實際上,它意味着如果我想將某些數據封裝到另一個類中,只有當新類沒有引用另一個類時才能這樣做...除非我願意創建一個新表來存儲它。 我會將這個問題公開一週,因爲我真的很想知道是否有其他方法。 – DBHC

相關問題