entity framework代码是否首先支持存储过程?

我观看了EF Code First的几个演示文稿,并没有看到EFCF如何与存储过程一起工作。

我怎样才能声明一个方法,将使用一些sp? 我可以将实体传递给调用sp的方法,而无需手动将实体属性映射到sp参数?

另外,如果我改变我的模型会发生什么? 在从模型中重新创build表格的时候,它会掉下我的sp吗? 那触发器呢?

如果这些东西不被支持,将来有没有计划支持他们?

编辑:我原来的答案EF4.1(下)现在已经过时了。 请参阅Diego Vega (在Microsoft的EF团队工作) 下面的答案 !


@gsharp和Shawn Mclean:你从哪里得到这些信息? 你还没有访问底层的ObjectContext吗?

IEnumerable<Customer> customers = ((IObjectContextAdapter)this) .ObjectContext.ExecuteStoreQuery<Customer>("select * from customers"); 

用一个存储过程replace“select”语句,然后你去。

至于你的其他问题:是的,不幸的是你的sp将会受到破坏。 您可能需要在代码中添加“CREATE PROCEDURE”语句。

对于EF 4.2:

 var customers = context.Database.SqlQuery<Customer>("select * from customers") 

更新:从EF6开始,EF Code First支持插入,更新和删除的存储过程映射。 您可以使用MapToStoredProcedures方法在模型创build期间指定存储过程映射。 我们也支持这些操作的基本存储过程的自动脚手架。 请参阅此处的function规格。

原始答案:我们不支持在第一版中的Code-First模型中映射存储过程,也不能从types中为CRUD操作自动生成存储过程。 这些是我们将来要添加的function。

正如在这个线程中提到的,它可以回退到ObjectContext,但DbContext也提供了很好的API来执行原生的SQL查询和命令(例如DbSet.SqlQuery,DbContext.Database.SqlQuery和DbContext.Database.ExecuteSqlCommand)。 不同的SqlQuery版本具有EF4中存在的相同的基本实现function(如ExecuteStoreQuery: http : //msdn.microsoft.com/en-us/library/dd487208.aspx )。

希望这可以帮助。

  public IList<Product> GetProductsByCategoryId(int categoryId) { IList<Product> products; using (var context = new NorthwindData()) { SqlParameter categoryParam = new SqlParameter("@categoryID", categoryId); products = context.Database.SqlQuery<Product>("Products_GetByCategoryID @categoryID", categoryParam).ToList(); } return products; } public Product GetProductById(int productId) { Product product = null; using (var context = new NorthwindData()) { SqlParameter idParameter = new SqlParameter("@productId", productId); product = context.Database.SqlQuery<Product>("Product_GetByID @productId", idParameter).FirstOrDefault(); } return product; } 

更安全的解决scheme是这样的:

http://strugglesofacoder.blogspot.be/2012/03/calling-stored-procedure-with-entity.html

这个类的用法是:

 var testProcedureStoredProcedure = new TestProcedureStoredProcedure() { Iets = 5, NogIets = true }; var result = DbContext.Database.ExecuteStoredProcedure(testProcedureStoredProcedure); 

对于.NET Core(EntityFrameworkCore),我已经能够让他们工作。

可能不是最好的,但这绝对有效。

添加存储过程的迁移如下所示 :

 using Microsoft.EntityFrameworkCore.Migrations; using System.Text; namespace EFGetStarted.AspNetCore.NewDb.Migrations { public partial class StoredProcedureTest : Migration { protected override void Up(MigrationBuilder migrationBuilder) { StringBuilder sb = new StringBuilder(); sb.AppendLine("CREATE PROCEDURE GetBlogForAuthorName"); sb.AppendLine("@authorSearch varchar(100)"); sb.AppendLine("AS"); sb.AppendLine("BEGIN"); sb.AppendLine("-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements."); sb.AppendLine("SET NOCOUNT ON;"); sb.AppendLine("SELECT Distinct Blogs.BlogId, Blogs.Url"); sb.AppendLine("FROM Blogs INNER JOIN"); sb.AppendLine("Posts ON Blogs.BlogId = Posts.BlogId INNER JOIN"); sb.AppendLine("PostsAuthors ON Posts.PostId = PostsAuthors.PostId Inner JOIN"); sb.AppendLine("Authors on PostsAuthors.AuthorId = Authors.AuthorId"); sb.AppendLine("Where Authors.[Name] like '%' + @authorSearch + '%'"); sb.AppendLine("END"); migrationBuilder.Sql(sb.ToString()); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.Sql("DROP PROCEDURE GetBlogForAuthorName"); } } } 

我可以用下面的代码来调用它:

 var blogs = _context.Blogs.FromSql("exec GetBlogForAuthorName @p0", "rod").Distinct(); 

后来尝试获取一些相关的数据(一对多的关系数据,例如发布内容),博客回来了填充后的内容如表所示。