我一直在尝试开始使用实体框架并遇到了一种特殊的行为。我准备了这个简短的例子来演示。
简而言之,我正在尝试使用基本类型和继承类型“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();
}
}
结果:
一切都很好。
现在,如果我删除 Employee 实体并注释掉“var result2 ...”行,我会得到以下结果:
我没有对数据库中的数据进行任何更改。请注意所有实体现在如何拥有一种超级英雄!值得注意的是,我必须将“Superpower”属性设置为 Nullable=True,否则会出现异常,因为实际上只有一条记录是超级英雄(其他记录在 PersonSet_Superhero 表中没有任何整数)
那么,这是实体框架、ODAC 或其他任何东西中的错误,还是我在这里做错了什么?