在Visual Studio 2012中使用数据库优先的Entity Framework模型进行MVC4脚手架搭建。

11
我在使用Visual Studio 2012时遇到了问题,尝试添加一个带有脚手架的MVC4控制器。理想情况下,我希望从数据库生成一个Entity Framework模型(edmx文件等),并将其放在与我的Web应用程序不同的程序集中,使用“添加新项”-“ADO.NET Entity数据模型”(即不是Code First)。但是,当我这样设置并使用“添加控制器”时,指定“使用Entity Framework的MVC控制器”,并从DatabaseModel程序集中选择一个Model类和Data context类时,会弹出以下警告消息:

“Ifl.Payforit4.DatabaseModel.Mno” 不属于指定的 “Ifl.Payforit4.DatabaseModel.Payforit4Entities” 类,而且无法修改 “Ifl.Payforit4.DatabaseModel.Payforit4Entities” 类以添加一个 “DbSet” 属性给它。(例如,“Ifl.Payforit4.DatabaseModel.Payforit4Entities” 类可能位于编译后的程序集中。)

不能修改该类是有道理的,因为它在另一个程序集中(虽然在同一解决方案中),并通过T4自动生成,但查看Payforit4Entities的自动生成代码后,“DbSet”属性已经很明显地存在了。

    public DbSet<Mno> Mnoes { get; set; }
我已经尝试了许多其他方法:
1. 直接将数据模型放入 Web 应用程序中。 2. 更改模型类为数据库中的各种其他表,以防 Mno 类存在问题。 3. 将数据模型减少到一个简单的单一表格。 4. 使用 Entity Framework Power Tools Beta 2 反向工程出一个 Code First 模型。这产生了一组新的错误。我可以理解它为什么是 beta 版。 5. 将 ADO.NET 数据模型代码生成策略从“无”更改为“默认”,以创建基于 ObjectContext 而不是 DbContext 的数据模型。 6. 关闭复数形式,使属性名为 Mno 而不是 Mnoes。
除手写 Code First DbContext 派生类和 POCO 外,以上任何方法都没有奏效。巧合的是,我找到的每个演示 MVC4 脚手架的例子都使用此类数据模型。是否有什么地方说 Code First 是唯一可与 MVC4 脚手架配合使用的数据模型?有人成功地在 Visual Studio 2012 中对数据库先有 (.edmx) 数据模型使用脚手架吗?我的数据库足够复杂,所以我宁愿坚持数据库优先策略。
我可以看出 Code First 和 Database First 模型的脚手架必然存在一些差异。例如,前者具有由 KeyAttribute 指示的 POCO 属性所持有的键,而后者在 edmx 模型文件中保存该信息。这是 Entity Framework Power Tools 反向工程功能的原理吗?我们是否应该从 edmx 文件转移到反向工程的 Code First 模型以使用 MVC4 脚手架?如果是这样,我们是否应该继续使用动态数据项目,直到 Entity Framework Power Tools 完成?
4个回答

13

这很有效,向 StackOverflow 致敬,因为在我输入问题时给了我这个链接。 - done_merson
1
当我尝试这个时,我得到了“模型类型无效。请从列表中选择一个项目。” - JasonRed
这个有效,谢谢。请注意它有效的原因是在您的项目根目录中创建了一个新的DbContext类。 - Matt
解决了我遇到的问题,但是它在根目录创建了一个DbContext。这不是什么大问题,你可以删除它并设置使用正确的DbContext。 - Joshua Evensen

0

Entity Framework 5/VS 2012中的edmx代码生成器存在缺陷。它创建的代码充满编译错误。我猜测在vs2012发布时它还没有准备好,这就是为什么他们将默认代码生成标志设置为none的原因。

对于微软唯一的问题是:我们可以期待何时更新来修复这个问题?


0

我认为我们不能使用Entity Framework 5从edmx文件中进行脚手架。

我尝试了类似的一些方法,但仍然遇到错误。

有一些建议可能只需删除错误的edmx并重新开始,就可以生成正确的.tt文件以允许脚手架正常工作,但我还没有看到这种情况。

我将继续尝试使其正常工作,因为我更喜欢基于数据库的方法。如果我有任何进展,我会更新这个答案。


你已经找到解决方案了吗?我也更喜欢数据库优先的方法。 - daniel
不,我并没有找到任何有用的解决方案。正如下面alexb所说,它不是非常稳健的,希望在更新中能得到改善。 - James Osborn
@zoidbergi:和你一样,我在我的 MVC4 项目中使用 EF5 数据库优先的脚手架遇到了很多问题。我在 VS2013 预览版上进行了测试:同一个项目,同样的代码现在可以正常工作了。因此,我暂时在虚拟机上安全地使用 VS2013,并能够在必要时切换回 VS2012。 - JYL

-2

这是真的! 诀窍在于首先编译您的解决方案,然后手动键入上下文类。不要从下拉列表中选择它,只需自己输入类名,它就会神奇地工作;-)

谢谢你,Marcus!


1
请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本:请不要复制粘贴答案以表达感激之情。 - Jens Wirth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接