实体Fw 4,MVC3,Derived类不出现在ObjectContext中

时间:2012-01-19 10:42:36

标签: asp.net-mvc-3 entity-framework-4

我正在使用MVC3和EF(版本4,但不确定是否4.0,4.1等)。从昨天开始我一直在与这个斗争,我在任何地方都找不到答案。我正在使用“Pro Entity Framework 4.0”一书。

我做了Model First方法,因为我想使用继承,我创建了一个基本模型来进行第一次测试(对不起,点击链接,我没有足够的代表来放置图片):

EF Model

然后使用这个模型我创建了数据库。我对命名约定不是很满意,因为尽管实体名称多元化,但对于派生类表,它创建了一个带前缀的单个表名。对不起,我没有安装SSMS,但看看服务器资源管理器,请看图片:

DB created from EF Model

然后我使用模板“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();

我错过了什么吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

继承层次结构映射到一个DbSet。如果要过滤继承的实体,可以使用:

  DerivedClass derivedclass = db.BaseClasses.OfType<DerivedClass>().Single(d => d.Id == id);

OfType<>()过滤为您指定类型的实例设置的对象。

为了添加和更新派生实体,您也可以将父DbSet和EF映射到正确的表。