0

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

谢谢

4

3 回答 3

1

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

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

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

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

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

于 2012-12-14T16:06:45.347 回答
0

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

<connectionStrings>

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

YouDBModel.Context.tt
   > YourBDModel.Context.cs
于 2013-08-20T10:01:39.003 回答
0

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

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

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

于 2013-05-08T16:49:21.850 回答