fre*_*nky 112 c# stored-procedures entity-framework code-first
我已经看了几次EF Code First的演示,还没有看到EFCF如何与存储过程一起工作.
如何声明一个将使用某些sp的方法?我是否可以将实体传递给调用sp的方法,而无需手动将实体属性映射到sp参数?
另外,如果我改变模型会发生什么?它会在从模型中重新创建表格时丢失我的sp吗?触发器呢?
如果不支持这些东西,是否有计划在将来支持它们?
ano*_*non 66
编辑:我对EF4.1(下面)的原始答案现已过时.请参阅以下来自Diego Vega(他在Microsoft的EF团队工作)的答案!
@gsharp和Shawn Mclean:你在哪里得到这些信息?你还没有访问底层的ObjectContext吗?
IEnumerable<Customer> customers =
((IObjectContextAdapter)this)
.ObjectContext.ExecuteStoreQuery<Customer>("select * from customers");
Run Code Online (Sandbox Code Playgroud)
用存储的proc替换"select"语句,然后就可以了.
至于你的另一个问题:是的,不幸的是你的sp会被破坏.您可能需要在代码中添加"CREATE PROCEDURE"语句.
对于EF 4.2:
var customers = context.Database.SqlQuery<Customer>("select * from customers")
Run Code Online (Sandbox Code Playgroud)
div*_*ega 50
更新:从EF6开始,EF Code First支持插入,更新和删除的存储过程映射.您可以使用MapToStoredProcedures方法在模型创建期间指定存储过程映射.我们还支持这些操作的基本存储过程的自动脚手架.请参阅此处的功能规范.
原始答案: 我们不支持在第一版中的Code-First模型中映射存储过程,也没有办法从类型中自动生成CRUD操作的存储过程.这些是我们希望将来添加的功能.
正如在这个线程中提到的那样,可以回退到ObjectContext,但是DbContext也提供了很好的API来执行本机SQL查询和命令(例如DbSet.SqlQuery,DbContext.Database.SqlQuery和DbContext.Database.ExecuteSqlCommand).不同的SqlQuery版本具有与EF4中相同的基本实现功能(如ExecuteStoreQuery:http://msdn.microsoft.com/en-us/library/dd487208.aspx).
希望这可以帮助.
小智 31
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;
}
Run Code Online (Sandbox Code Playgroud)
更安全的解决方案是:
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91497 次 |
| 最近记录: |