1

我們的組織正在尋求在v4推出後對實體框架進行標準化。因此,我正在考慮如何將使用NHibernate進行持久化的應用程序遷移到使用POCO支持的EF4。在幾個地方我們使用單表繼承(也稱爲Table Per Hierarchy)。我一直無法使用以下方式使其工作。實體框架中每個等級繼承POCO實體的表4

付款(基類[應該是抽象的,但有問題存在,以及]) 類:CreditCardPayment(具體實現) ACHPayment(具體實現) CheckPayment(具體實現)

現在,我與它們映射只有基類的屬性。所有這些類都在同一個命名空間中。他們在數據庫中有一個叫做PaymentTypeId的鑑別器,所以Payment映射的條件是「When PaymentTypeId = 0」。每個子類具有不同值的相同條件(即CreditCardPayment = 1等)。

當我嘗試加載每一個使用DataContext.Payments.ToList()(DataContext的從ObjectContext的繼承),我收到以下異常的所有款項的清單:

「對象映射不能用於類型發現身份'DataLayer.DataModel.CreditCardPayment'。「

我不明白這是什麼意思,因爲POCO CreditCardPayment類與POCO Payment類所在的命名空間相同(實際上在同一個文件中)。

我錯過了什麼?

回答

0

我之前並沒有表現出來(我認爲它並不相關,但它是)。 CreditCardPayment是從名爲「CreditPayment」的中介類繼承而來的,並且從CashPayment繼承了ACHPayment。 CreditCardPayment和CashPayment存在於相同的名稱空間和文件中,但未在EF映射中表示。一旦我將這些添加到映射文件中,一切正常。

所以,甚至想到EF不會永遠映射到這些類型直接的一個,它似乎需要了解他們,因爲它改變了類:CreditCardPayment類等的基本類型。感謝您對此的幫助。

3

這是抱怨不是關於數據庫映射,而是模型到CLR映射。

英孚不能因爲某種原因找到你的CreditCardPayment類。

現在一個可能的原因是你還沒有加載它的元數據。當您查詢EF不知道在哪裏居住類:CreditCardPayment

Assembly 1: 
- Payment 

Assembly 2 references Assembly 1: 
- CreditCardPayment extends Payment 

然後:

例如,如果你有這樣的。

來解決這個問題的方法是使用LoadAssembly即:

using (DataContext ctx = new DataContext()) 
{ 
    ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly); 

    // now do your query. 

} 

你需要告訴LoadFromAssembly每次不直接通過您的DataContext類引用組裝。

注意:typeof(Payment).Assembly由於IQueryable<Payment>付款屬性而被直接引用。

希望這有助於

亞歷

微軟。

+0

謝謝亞歷克斯。在我的DataContext類的構造函數中,我添加了「this.MetadataWorkspace.LoadFromAssembly(typeof(CreditorCardPayment).Assembly);」到「_payments = CreateObjectSet ();」但「類型...無法找到對象映射」錯誤依然存在。這些是POCO類(付款和CreditorCardPayment),這是否改變了這裏需要做的事情 – SteveBering 2009-12-07 14:40:07