Asp.net mvc 3 代码优先方法与数据库优先方法

Asp.net mvc 3 代码优先方法与数据库优先方法,asp.net-mvc-3,entity-framework,code-first,Asp.net Mvc 3,Entity Framework,Code First,我正在开发一个asp.net MVC 3 web应用程序,我首先使用数据库,但是在我使用entity framework将DB表映射到实体类之后,我正在与这些表交互,因为我将使用代码优先的方法,将数据库表作为类和对象处理 因此,在将表映射到实体类之后,我发现代码优先方法和数据库优先方法非常相似,但除了从头开始编写实体类(如代码优先)之外,我已经从现有数据库表创建了实体类,这在我的例子中更容易、更方便 那么,是否有一些特定情况下,我将无法实现某些功能,除非我使用一种方法而不是另一种方法,而到目前为

我正在开发一个asp.net MVC 3 web应用程序,我首先使用数据库,但是在我使用entity framework将DB表映射到实体类之后,我正在与这些表交互,因为我将使用代码优先的方法,将数据库表作为类和对象处理

因此,在将表映射到实体类之后,我发现代码优先方法和数据库优先方法非常相似,但除了从头开始编写实体类(如代码优先)之外,我已经从现有数据库表创建了实体类,这在我的例子中更容易、更方便


那么,是否有一些特定情况下,我将无法实现某些功能,除非我使用一种方法而不是另一种方法,而到目前为止,我找不到任何方法?

我认为CodeFirst的最大局限性(与ModelFirst/DatabaseFirst方法相比)就是不能将CUD操作映射到存储过程。如果你不打算这样做,那么你应该很乐意去做。
更具体地说,您可以在DbSet上使用SqlQuery方法调用存储过程,这将导致跟踪返回的实体,或者在数据库类上使用更通用的SqlQuery和ExecuteSqlCommand(对于Database.SqlQuery,返回的对象不必是实体,也不必跟踪这些对象)。就这样。不能将创建/更新/删除操作映射到存储过程。功能导入也不受支持

编辑


现在可以将CUD操作映射到EF6中的存储过程了

我认为CodeFirst(与ModelFirst/DatabaseFirst方法相比)的最大限制是无法将CUD操作映射到存储过程。如果你不打算这样做,那么你应该很乐意去做。
更具体地说,您可以在DbSet上使用SqlQuery方法调用存储过程,这将导致跟踪返回的实体,或者在数据库类上使用更通用的SqlQuery和ExecuteSqlCommand(对于Database.SqlQuery,返回的对象不必是实体,也不必跟踪这些对象)。就这样。不能将创建/更新/删除操作映射到存储过程。功能导入也不受支持

编辑


现在可以将CUD操作映射到EF6中的存储过程了

在使用db-1st EDMX pre EF 4.1解决了许多难题之后,我倾向于先编写代码。但我不打算宣扬它

除了Pawel的回答和评论中提到的直接存储过程映射和函数导入功能外,当您首先使用db时,您将无法更改生成文件中的名称空间或任何其他代码。Afaik所有文件都嵌套在.tt文件下。如果有办法将它们移动到项目中的逻辑文件夹和名称空间中,那么我不知道


另外,如果您想要将DbContext从实体分离到一个单独的项目中,我记得在EF4.1之前这是可能的。但它更麻烦,因为在每次数据库更改之后,您必须在这两个.tt文件上运行自定义工具。对于代码优先,这非常简单,因为您处理的是纯OOP

在使用db-1st EDMX pre EF 4.1解决了许多令人头疼的问题后,我倾向于先编写代码。但我不打算宣扬它

除了Pawel的回答和评论中提到的直接存储过程映射和函数导入功能外,当您首先使用db时,您将无法更改生成文件中的名称空间或任何其他代码。Afaik所有文件都嵌套在.tt文件下。如果有办法将它们移动到项目中的逻辑文件夹和名称空间中,那么我不知道


另外,如果您想要将DbContext从实体分离到一个单独的项目中,我记得在EF4.1之前这是可能的。但它更麻烦,因为在每次数据库更改之后,您必须在这两个.tt文件上运行自定义工具。对于代码优先,这非常简单,因为您处理的是纯OOP

我目前正在通过调用存储过程来实现一些功能,所以你的意思是我将无法在代码优先的方法中使用存储过程?您可以在DbSet上使用SqlQuery方法调用存储过程,这将导致跟踪返回的实体,或者在数据库类上使用更通用的SqlQuery和ExecuteSqlCommand(对于Database.SqlQuery,返回的对象不必是实体,并且对这些对象没有跟踪)。仅此而已。您无法将创建/更新/删除操作映射到存储过程。FunctionImports也不受支持。完成-我已将注释复制到响应中。我当前正在通过调用存储过程来执行某些功能,因此您的意思是我将无法在代码优先方法中使用存储过程?您可以调用在DbSet上使用SqlQuery方法的存储过程,这将导致跟踪返回的实体,或者在数据库类上使用更通用的SqlQuery和ExecuteSqlCommand(对于Database.SqlQuery,返回的对象不必是实体,也不必跟踪这些对象)。仅此而已。无法将创建/更新/删除操作映射到存储过程。也不支持FunctionImports。完成-我已将注释复制到响应中。