【问题标题】:MVC 4 + Entity Framework 5 + Stored ProceduresMVC 4 + 实体框架 5 + 存储过程
【发布时间】:2013-08-20 18:01:39
【问题描述】:

我现在正在自学 MVC4(做了多年的网络表单),而且我正在 沮丧 - 但不是关于 MVC,这非常好。实体框架 是……嗯

我正在使用 VS2010。

问题

我们有一个真实的数据库,你知道用外键之类的东西标准化。但是我为 Entity Framework 找到的每个示例都直接指向表格,但我们很少有直接的表格拉出 - 填充下拉列表等。我们所有的前端调用都命中了一个存储过程(多么古老的学校!脏话删除

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

Entity Framework 和 MVC 不想在这个场景中发挥出色。我创建了我的 edmx 文件(仅限 SP),为 SP 导入了我的函数,一切都很好......'直到现在。

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

好的,所以现在我尝试使用 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,所以如果有更好的方式来访问数据库(无需从头开始编写所有代码),我会在这里倾听。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

    在架构方面,恕我直言,ORM 无疑是新应用程序开发的必经之路。它使数据进出数据库变得更加容易。也就是说,如果您习惯于通过存储过程访问所有内容并直接查询数据库,那么这是一个 范式转变。不要放弃它。一开始它会让你感到沮丧,就像学习任何新技术一样,但最终还是值得的。

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

    【讨论】:

    • 更不用说 EF 6 将支持存储过程。另一个推动的好理由。
    • 谢谢本。此时,我已经能够使用 EF 生成的代码从数据库中提取数据。但是,我现在正在研究其他 ORM - 特别是 PetaPOCO。
    • 那么这是否回答了您的问题?如果没有,请澄清一下,我会看看是否可以提供更多帮助。
    • @Ben。由于我让进程创建了自己的连接字符串,所以对于最初的问题,我认为这不是连接问题。我确定那是我开始操作 EF 的时候(比如删除 edmx)。我发现“大范式转变”会随着时间倒流,这个行业往往会忘记过去的罪恶,然后重蹈覆辙。
    • @IronMan84 感谢您的提醒,我想我会等待 EF6。
    【解决方案2】:

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

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

    一旦你有了它,在你的控制器中,你可以只使用你的 EF 实体的实例,而不是使用 DbContext 的实例。因此,如果您将 edmx 称为“MyDbAccess”,您应该能够使用 MyDbAccessEntities,然后您就可以访问存储过程。

    【讨论】:

      【解决方案3】:

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

      <connectionStrings>
      

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

      YouDBModel.Context.tt
         > YourBDModel.Context.cs
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        相关资源
        最近更新 更多