实体框架和继承 - EF中可能存在的错误?

时间:2012-07-16 14:42:34

标签: entity-framework odac

我一直在尝试开始使用实体框架并遇到了一种特殊的行为。我准备了这个简短的例子来证明。

简而言之,我正在尝试创建一个每个类型的表模型,使用基类型和继承类型“Person”和“Employee”。问题是,当我使用诸如

之类的行查询数据库时
var list = entities.PersonSet.OfType<Person>().ToList();

我希望得到一个人物对象列表。虽然列表的类型为List,但列表中的所有对象都是 Employee 对象,即使表中只有一个记录是针对员工的。看起来EF正在返回错误的类型。

但是,从Person中添加另一个继承的类型,例如“Superhero”(我试图将其作为一个明显的例子:),并创建一个超级英雄记录,现在同一个命令返回人员,员工和按预期超级英雄(以前我只有员工,即使他们不是员工)

详情

我正在使用VS2010和Oracle数据库,ODAC 11.2.0.3!我需要一些帮助来确认这是否是与Oracle相关的问题,或者在MSSQL数据库和DDL生成时是否也会发生这种情况。

我创建了一个新的控制台应用程序,然后转到Add-&gt; New file-&gt; 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或其他任何内容中的错误,还是我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

如果您使用Oracle Express作为您的数据库似乎是个问题。看一下this thread..我经历了同样的事情,罪魁祸首证明是Oracle XE,但这适用于Oracle 11g企业版。

答案 1 :(得分:0)

我发现如果我使用基本类型摘要,它可以在EF 5 w / Oracle 11g xe中使用。