0

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

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

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

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

但是,添加另一个从 Person 继承的类型,例如“Superhero”(我试图将其作为一个明显的示例 :),并创建一个 Superhero 记录,现在相同的命令会按预期返回 Persons、Employees 和 Superheroes 的混合(以前我只有员工,即使他们不是员工)

细节

我正在使用 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();
    }
}

结果:

结果 1

一切都很好。

现在,如果我删除 Employee 实体并注释掉“var result2 ...”行,我会得到以下结果:

结果 2

我没有对数据库中的数据进行任何更改。请注意所有实体现在如何拥有一种超级英雄!值得注意的是,我必须将“Superpower”属性设置为 Nullable=True,否则会出现异常,因为实际上只有一条记录是超级英雄(其他记录在 PersonSet_Superhero 表中没有任何整数)

那么,这是实体框架、ODAC 或其他任何东西中的错误,还是我在这里做错了什么?

4

2 回答 2

3

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

于 2012-11-08T22:47:52.547 回答
0

我发现如果我将基本类型抽象化,它可以在 EF 5 w/Oracle 11g xe 中工作。

于 2014-09-18T21:22:14.570 回答