我一直在尝试开始使用实体框架并遇到了一种特殊的行为。我准备了这个简短的例子来证明。
简而言之,我正在尝试创建一个每个类型的表模型,使用基类型和继承类型“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。然后我绘制了这个模型
我的代码如下所示:
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或其他任何内容中的错误,还是我在这里做错了什么?
答案 0 :(得分:3)
如果您使用Oracle Express作为您的数据库似乎是个问题。看一下this thread..我经历了同样的事情,罪魁祸首证明是Oracle XE,但这适用于Oracle 11g企业版。
答案 1 :(得分:0)
我发现如果我使用基本类型摘要,它可以在EF 5 w / Oracle 11g xe中使用。