我正在使用EF 4.1做一些工作,我想在3个表上执行批量更新(为了实现软删除)。通过快速研究,看起来直接SQL查询是最好的。我的实现如下,我希望得到一些关于这是否是最佳实践的反馈。谢谢你的帮助...
using (var scope = new TransactionScope())
{
using (var db = new TimeCatchDb())
{
db.Database.ExecuteSqlCommand("UPDATE EmployeeRecords SET Deleted = 1 WHERE NoteTypeId = @p0", new SqlParameter { ParameterName = "p0", Value = id});
db.Database.ExecuteSqlCommand("UPDATE Notes SET Deleted = 1 WHERE NoteTypeId = @p0", new SqlParameter { ParameterName = "p0", Value = id });
db.Database.ExecuteSqlCommand("UPDATE NoteTypes SET Deleted = 1 WHERE Id = @p0", new SqlParameter { ParameterName = "p0", Value = id });
}
scope.Complete();
}
答案 0 :(得分:13)
您可以使用以下扩展名扩展ef
扩展了Entity Framework功能的库。
特性 •批量更新和删除 •未来的查询 •审核日志 项目包和来源 NuGet包
PM> Install-Package EntityFramework.Extended
批量更新和删除 实体框架的当前限制是,为了更新或删除实体,您必须首先将其检索到内存中。现在在大多数情况下,这很好。然而,有一些senerios性能会受到影响。此外,对于单个删除,必须先检索该对象,然后才能删除该对象,从而需要对数据库进行两次调用。批量更新和删除消除了在修改实体之前检索和加载实体的需要。
//delete all users where FirstName matches
context.Users.Delete(u => u.FirstName == "firstname");
//update all tasks with status of 1 to status of 2
context.Tasks.Update(
t => t.StatusId == 1,
t => new Task {StatusId = 2});
//example of using an IQueryable as the filter for the update
var users = context.Users
.Where(u => u.FirstName == "firstname");
context.Users.Update(
users,
u => new User {FirstName = "newfirstname"})
答案 1 :(得分:2)
如果您想要批处理,为什么不将所有更新都放入单ExecuteSqlCommand
?每次调用ExecuteSqlCommand
都会自行往返数据库=它不是批处理。另请注意,如果当前在上下文中加载了任何已修改的记录,则不会反映更改=已加载的实体仍将具有Deleted = 1
。直接SQL命令仅影响数据库。
通过将自定义存储过程映射到Delete
操作(但它也不支持批处理),可以在普通EFv4 + EDMX中实现这一点,但是一旦没有EDMX,就无法做到这一点。