MVC 4 +实体框架5 +存储过程

时间:2012-12-13 22:07:19

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

  

我现在正在教自己MVC4(做了多年的网络形式),我就是   沮丧 - 但不是关于MVC这是非常好的。实体框架   是...以及

我正在使用VS2010。

问题

我们有一个真正的数据库,你知道用外键和东西标准化。但是我为实体框架找到的每个例子都直接用于表格,但是我们很少有一个直接的表格拉出一边填充下拉列表等。我们所有的前端电话都打了一个存储过程(学校多大了!咒骂删除

我喜欢MVC的模型体系结构,您可以在其中定义来自数据源的数据属性 - 显示名称,范围,数据类型。所以我绝对想保留这个。

实体框架和MVC不希望在这个场景中发挥出色。我创建了我的edmx文件(仅限SP),我的函数导入了SP,一切都很好....直到现在。

无法从edmx / designer创建控制器 - 输入控制器名称,选择使用EF读取的MVC控制器,选择FuntionName_Result的模型类,并选择上下文...实体名称。失败无法检索元数据

好的,所以现在我尝试EF 5.x DbContext Generator,更新文件名和繁荣我有一个模型和上下文 - 真棒我现在可以做酷MVC的东西,让重建网站....哦恐怖 - 之前已经定义了所有内容。

我尝试在不同的文件夹中生成edmx和/或在DBContext生成器之后删除它,仍然无法创建Controller。

'blah' is not part of the specified 'Context' class, and the 'Context' class could not be modifed to add a 'DbSet' property to it. (For example, the 'Context' class might be in a compiled assembly.)

如果我手动添加DBSet,我又回到无法检索元数据 - 我假设这种情况正在发生,因为它无法连接到数据库。我不知道在哪里告诉它使用web.config中的连接字符串。 - 如果这是问题

我的MVC希望有一个更光明的未来。

我错过了什么?

我没有和EF结婚,所以如果有更好的方式来访问数据库(没有从头开始编写所有代码),我就在这里听。

由于

3 个答案:

答案 0 :(得分:1)

实体框架在很大程度上依赖于约定。需要一点时间来习惯。例如,对于连接字符串...如果实体框架找不到与您的DBcontext类同名的连接字符串,则它只创建一个(我认为它默认使用项目名称作为数据库名称)。如果该数据库不存在,它将在本地创建为sql express DB。这会导致您报告的错误类型。

如果要为实体框架定义连接字符串,您只需在web.config中提供连接字符串即可。再次约定....连接字符串的名称应与您的DBContext类相同,实体框架才能找到它。

<connectionStrings>
      <add name="MyDbContextClassName" connectionString="..." />
</connectionStrings>

在体系结构说明中,恕我直言ORM是新应用程序开发的方式。它使得数据进出数据库变得更加容易。如果您习惯通过sprocs访问所有内容并直接查询数据库,那么它就是 Big 范式转换。不要放弃它。一开始它会让你感到沮丧,就像拿起任何新技术一样,但最终还是值得的。

我过去曾使用实体框架和nHibernate进行ORM。我喜欢实体框架的事情是,如果你使用代码首次迁移,大多数真正烦人,繁琐且容易出错的列映射都是为你自动生成的(再次使用约定)。你有时候仍然需要进行一些映射,但这些情况非常罕见。如果您已经拥有数据库,可能会少一些,因为您的列名可能并不总是与实体框架约定相匹配。无论如何......这在我的书中是一个很大的优点,为什么我会偏爱EF而不是nHibernate。

答案 1 :(得分:0)

如果您已有数据库,则使用存储过程不需要EF 5.X DbContext Generator。在项目中创建文件夹或在解决方案中创建新项目以进行数据访问。在该文件夹/项目中,添加edmx文件并使用向导将其配置为现有数据库。在此阶段,您可以拉入存储过程。

如果打开edmx文件,则可以转到模型资源管理器选项卡并管理导入的函数(存储过程)及其返回类型。

完成后,在控制器中,您可以只使用EF实体的实例,而不是使用DbContext的实例。因此,如果您调用edmx“MyDbAccess”,您应该能够使用MyDbAccessEntities,然后允许您访问存储过程。

答案 2 :(得分:0)

我在你的App.config文件中检查你的

<connectionStrings>

检查您的存储过程是否已添加到模型上下文文件中

YouDBModel.Context.tt
   > YourBDModel.Context.cs