2012-07-16 51 views
0

我一直在嘗試開始使用實體框架,並且遇到了一個奇怪的行爲。我準備了這個簡短的例子來演示。實體框架和繼承 - EF中可能的錯誤?

簡而言之,我嘗試使用基本類型和繼承類型「Person」和「Employee」創建一個每類型表模型。問題是,當我用線如

var list = entities.PersonSet.OfType<Person>().ToList(); 

我希望得到的人對象的列表查詢數據庫。雖然列表的類型爲List,但列表中的所有對象都是Employee對象,儘管表中只有一個記錄是針對某個員工的。它看起來像EF返回錯誤的類型。

但是,從Person中添加另一個繼承類型,例如「超級英雄」(我試圖讓這是一個明顯的例子:),並創建一個超級英雄記錄,現在同樣的命令返回人員,僱員和超級英雄預期(而以前我只得到了員工,即使他們不是僱員)

詳細

我使用VS2010和Oracle的數據庫,ODAC 11.2.0.3!我需要一些幫助來確認這是Oracle相關的問題,還是MSSQL數據庫和DDL生成時也會發生這種情況。

我創建了一個新的控制檯應用程序,並轉到Add-> New file-> ADO.NET Entity Data Model。然後我得出了這個模型

EF Model

我的代碼如下所示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var e = new Entities(); 

     var result1 = e.PersonSet.OfType<Superhero>().ToList(); 
     var result2 = e.PersonSet.OfType<Employee>().ToList(); 
     var result3 = e.PersonSet.OfType<Person>().ToList(); 
    } 
} 

,結果:

result 1

一切都很好。

現在,如果我刪除Employee實體和註釋掉「VAR RESULT2 ......」行了,我得到這樣的結果:

result 2

我在數據庫中所做的任何更改數據。注意所有實體現在都有一種超級英雄!值得注意的是,我必須將「Superpower」屬性設置爲Nullable = True,否則我會得到一個異常,因爲實際上只有一個記錄是超級英雄(其他記錄在PersonSet_Superhero表中沒有任何實體)

那麼,這是一個實體框架,ODAC或其他任何錯誤,或者我在這裏做錯了什麼?

+0

這和EF和MSSQL的預期一樣 - 你可以很容易地用SQL Express自己試試。 – 2012-07-16 19:16:29

回答

3

如果您使用Oracle Express作爲您的數據庫似乎是問題所在。看看this thread..我經歷了同樣的事情,罪魁禍首竟然是Oracle XE,但是它可以在Oracle 11g企業版上運行。

0

我發現,如果我提出了基類型抽象,它在EF 5 w/Oracle 11g xe中工作。