我正在使用MVC3和EF(版本4,但不确定是否4.0,4.1等)。从昨天开始我一直在与这个斗争,我在任何地方都找不到答案。我正在使用“Pro Entity Framework 4.0”一书。
我做了Model First方法,因为我想使用继承,我创建了一个基本模型来进行第一次测试(对不起,点击链接,我没有足够的代表来放置图片):
然后使用这个模型我创建了数据库。我对命名约定不是很满意,因为尽管实体名称多元化,但对于派生类表,它创建了一个带前缀的单个表名。对不起,我没有安装SSMS,但看看服务器资源管理器,请看图片:
然后我使用模板“Controller with read / write actions and views,using Entity Framework”为BaseClass创建了控制器。它很棒!它创建了所有视图,CRUD。
例如在Details视图中我有这段代码:
//
// GET: /BaseClass/Details/5
public ViewResult Details(int id)
{
BaseClass baseclass = db.BaseClasses.Single(b => b.Id == id);
return View(baseclass);
}
工作正常。
然后我为DerivedClass做了同样的事情,我得到了所有CRUD操作和视图的控制器。而现在的问题。例如,DerivedClass的Details控制器是这样的:
//
// GET: /DerivedClass/Details/5
public ViewResult Details(int id)
{
DerivedClass derivedclass = db.BaseClasses.Single(d => d.Id == id);
return View(derivedclass);
}
正如您所看到的那样,尝试获取db.BaseClasses而不是db.DerivedClasses,并且提供了编译错误,但db没有提供对DerivedClass实体的任何访问,db中根本没有任何与DerivedClass.But相关的内容。如果我在代码中手动创建DerivedClass实例,那么:
MyNamespace.Blablabla.Site.Models.DerivedClass dev = new Models.DerivedClass();
我错过了什么吗?提前谢谢。
答案 0 :(得分:1)
继承层次结构映射到一个DbSet。如果要过滤继承的实体,可以使用:
DerivedClass derivedclass = db.BaseClasses.OfType<DerivedClass>().Single(d => d.Id == id);
OfType<>()
过滤为您指定类型的实例设置的对象。
为了添加和更新派生实体,您也可以将父DbSet和EF映射到正确的表。