2010-02-16 24 views
0

使用EF 4.0代碼只是我想在抽象類和普通類之間進行關聯。EF 4.0代碼只從摘要到派生的關聯

我有類 '項目', 'ContentBase' 和 '測試'。

「ContentBase」是抽象的,「測試」提煉出來的。

「ContentBase」有一個屬性「項」鏈接到「項目」的一個實例。

所以這是Test.Item「或從「ContentBase」派生的任何類有一個「項目」導航屬性。

在我的數據庫中,Test的每條記錄都有一個與Item匹配的記錄。


public class Item 
{ 
    public int Id { get; set;} 
} 

public abstract class ContentBase 
{ 
    public int ContentId { get; set;} 
    public int Id { get; set;} 

    public Item Item { get; set;} 
} 

public class Test : ContentBase 
{ 
    public string Name { get; set;} 
} 

現在一些初始化代碼

public void SomeInitFunction() 
{ 

    var itemConfig = new EntityConfiguration<Item>(); 
    itemConfig.HasKey(p => p.Id); 
    itemConfig.Property(p => p.Id).IsIdentity(); 
    this.ContextBuilder.Configurations.Add(itemConfig); 

    var testConfig = new EntityConfiguration<Test>(); 
    testConfig.HasKey(p => p.ContentId); 
    testConfig.Property(p => p.ContentId).IsIdentity(); 

    // the problem 
    testConfig.Relationship(p => p.Item).HasConstraint((p, q) => p.Id == q.Id); 

    this.ContextBuilder.Configurations.Add(testConfig); 
} 

這給出了一個錯誤: 的關鍵是註冊了派生類型 '測試'。密鑰必須註冊爲根類型'ContentBase'。

無論如何,我嘗試我得到一個錯誤。我做錯了什麼?

回答

0

目前爲止的結論:不可能。

0

的導航屬性項目是在基本型級別定義,因此該模型是知道的基本類型 - 你可以添加屬性的測試類通過Item屬性和 地圖在你的關係:

public class Test : ContentBase 
{ 
    public string Name { get; set;} 
    public string TestItem { get {return Item;} ... 

} 

testConfig.Relationship(p => p.TestItem) 
0

嘗試suppertype實體重新聲明你的關係:

在ContentBase: 公共虛擬項目項目{獲得;設置;}

在測試: 公開新項目項目{獲得;設置;}

這編譯我的測試項目,但我沒有進一步的測試。 只是暫時,wheb EF5或最後comeso