我一直在嘗試開始使用實體框架,並且遇到了一個奇怪的行爲。我準備了這個簡短的例子來演示。實體框架和繼承 - 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。然後我得出了這個模型
我的代碼如下所示:
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();
}
}
,結果:
一切都很好。
現在,如果我刪除Employee實體和註釋掉「VAR RESULT2 ......」行了,我得到這樣的結果:
我在數據庫中所做的任何更改數據。注意所有實體現在都有一種超級英雄!值得注意的是,我必須將「Superpower」屬性設置爲Nullable = True,否則我會得到一個異常,因爲實際上只有一個記錄是超級英雄(其他記錄在PersonSet_Superhero表中沒有任何實體)
那麼,這是一個實體框架,ODAC或其他任何錯誤,或者我在這裏做錯了什麼?
這和EF和MSSQL的預期一樣 - 你可以很容易地用SQL Express自己試試。 – 2012-07-16 19:16:29