0

我只是现在教自己MVC4(网络形式多年),我 沮丧 - 但不是关于MVC这是相当不错的。实体框架 是...以及MVC 4 +实体框架5 +存储过程

我正在使用VS2010。

问题

我们有一个真正的数据库,你知道归与像外键和东西。但是我发现的Entity Framework的每个例子都是直接的表格,但我们很少有一个直观的表格填充下拉菜单等。我们所有的前端调用打一个存储过程(怎么老同学脏话删除!)

我爱的MVC模式架构在其中定义从数据源来的数据的属性 - 显示名称,范围,数据类型。等等,所以我一定要保持这个。

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

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

好的,现在我尝试EF 5.x DbContext生成器,更新文件名和繁荣我有一个模型和上下文 - 真棒现在我可以做很酷的MVC的东西,让我们重建网站。哦,恐怖 - 一切都已经定义过了。

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

'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结婚,所以如果有更好的方法来访问数据库(不需要从头开始编写所有的代码),我在这里倾听。

谢谢

回答

1

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

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

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

在体系结构笔记中,恕我直言,ORM's是挑战新应用程序开发的方式。它使数据进出数据库变得非常容易。这就是说,如果您习惯通过sprocs访问所有内容并直接查询数据库,则这是一个Big范式转换。不要放弃它。起初就像捡起任何新科技一样,它会让你感到沮丧,但最终它是值得的。

过去我使用过ORM的实体框架和nHibernate。我喜欢关于实体框架的事情是,如果您首先使用代码迁移,那么大多数真正烦人,乏味且容易出错的列映射都是为您自动生成的(再次使用约定)。你有时仍然不得不做一个小小的映射,但这些案例很少。如果你已经有一个数据库,可能会少一些,因为你的列名可能不会总是匹配实体框架约定。无论如何...这是我书中的一个重要优势,为什么我会在nHibernate上偏袒EF。

+0

且不说EF 6是要支持存储特效。还有一个很好的理由来推动。 – IronMan84

+0

谢谢本。在这一点上,我已经能够使用EF生成的代码从数据库中提取数据。但是,我现在正在研究其他ORM - 特别是PetaPOCO。 –

+0

那么这是回答你的问题还是不回答?如果不是,请澄清,我会看看我是否可以提供更多帮助。 –

0

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

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

一旦你有了,在你的控制器中,而不是使用DbContext的实例,你可以使用你的EF实体的一个实例。所以,如果你打电话给你的edmx'MyDbAccess',你应该可以使用MyDbAccessEntities,这将允许你访问存储过程。

0

我在你的app.config文件检查

<connectionStrings> 

登记后,如果在模型方面的文件添加存储过程

YouDBModel.Context.tt 
    > YourBDModel.Context.cs