Linq 2实体的一个老问题。我只是再问一遍,以防有人提出解决方案。
我想执行执行此操作的查询:
UPDATE dbo.Products WHERE Category = 1 SET Category = 5
我想用Entity Framework 4.3.1。
这只是一个例子,我有大量的记录,我只想要1列来改变价值,没有别的。使用Where(...)加载到DbContext。选择(...),更改所有元素,然后使用SaveChanges()保存对我来说效果不佳。
我应该坚持使用ExecuteCommand并发送如上所述的直接查询(当然可以重复使用),还是有另一种很好的方法可以从Linq 2 Entities / Fluent中完成。
谢谢!
答案 0 :(得分:1)
您所描述的内容实际上并不适用于Entity Framework。你有几个选择,
.ExecuteSqlCommand
执行(在上下文中)答案 1 :(得分:0)
您可以更新实体,而无需先从db中获取实体,如下所示
using (var context = new DBContext())
{
context.YourEntitySet.Attach(yourExistingEntity);
// Update fields
context.SaveChanges();
}
答案 2 :(得分:0)
如果你有基于集合的操作,那么SQL比EF更适合。
所以,是的 - 在这种情况下,你应该坚持使用ExecuteCommand
。
答案 3 :(得分:0)
我不知道这是否适合您,但您可以尝试创建将执行更新的存储过程,然后将该过程作为函数导入添加到模型中。然后,您可以在单个数据库调用中执行更新:
using(var dc = new YourDataContext())
{
dc.UpdateProductsCategory(1, 5);
}
其中UpdateProductsCategory
将是导入的存储过程的名称。
答案 4 :(得分:0)
是的,ExecuteCommand()绝对是在没有获取所有行的情况下执行此操作的方法。数据并让ChangeTracker对其进行排序。仅举一个例子:
将导致获取所有行并更改每行的更新:
using (YourDBContext yourDB = new YourDBContext()) {
yourDB.Products.Where(p => p.Category = 1).ToList().ForEach(p => p.Category = 5);
yourDB.SaveChanges();
}
只需一次更新:
using (YourDBContext yourDB = new YourDBContext()) {
var sql = "UPDATE dbo.Products WHERE Category = @oldcategory SET Category = @newcategory";
var oldcp = new SqlParameter { ParameterName = "oldcategory", DbType = DbType.Int32, Value = 1 };
var newcp = new SqlParameter { ParameterName = "newcategory", DbType = DbType.Int32, Value = 5 };
yourDB.Database.ExecuteSqlCommand(sql, oldcp, newcp);
}