我想要的要附加到记录的备注列。
我不想要做的是获取整个记录,这是非常重要的。
这是不工作的代码:
string AppendNote(int key, string note)
{
using (MyEntities _Context = new MyEntities())
{
var _Record = _Context.Records
.Where(x => x.Id == key)
.Select(x => new Record { Id = x.Id, Notes = x.Notes })
.First();
_Record.Notes += note;
_Context.SaveChanges();
}
}
正确的方法是什么?
我意识到它与这个非常古老的问题非常相似:Update statement with Entity Framework这个类似但最终不同的问题:How to update a record without selecting that record again in ADO.NET Entity Framework?但是,似乎还有 一种方式。
答案 0 :(得分:2)
对于EF中的简单最小更新,您可以通过将对象附加到上下文来执行此操作:
string AppendNote(int key, string note)
{
using (MyEntities _Context = new MyEntities())
{
var _Record = new Record { Id = key };
_Context.Entry(_Record).State = System.Data.EntityState.Unchanged;
_Record.Notes = note; //a simple update
_Context.SaveChanges();
}
}
但是,您希望追加到当前值。由于匿名类型变量 _R ,下面的代码有点乱,但它应该只获取Notes列并附加到它:
string AppendNote(int key, string note)
{
using (MyEntities _Context = new MyEntities())
{
var _R = _Context.Records
.Select(x=>new {Id = x.Id, Notes=x.Notes})
.Where(x=>x.Id == key)
.First();
var _Record = new Record { Id = _R.Id, Notes=_R.Notes };
_Context.Entry(_Record).State = System.Data.EntityState.Unchanged;
_Record.Notes+= note;
_Context.SaveChanges();
}
}
答案 1 :(得分:1)
实体框架afaik无法做到这一点。您可以执行的唯一优化是延迟加载导致“重大负载”的所有属性,这些属性在加载记录实体并更新实体时不会加载它们。
如果您想避免首先加载实体,可以使用ExecuteStoreQuery()
直接执行SQL以进行这些性能关键更新。
最后,EF是一个使CRUD更容易的ORM,但你确实使用这种抽象来支付性能价格。
答案 2 :(得分:1)
使用Entity Framework(或任何其他ORM)执行此操作的最简单方法是使用存储过程 - 例如:
CREATE PROCEDURE dbo.UpdateNote(@Key INT, @Note VARCHAR(500))
然后在该存储过程中有一个简单的UPDATE
语句来完成工作。
从Entity Framework中,您可以将该存储过程导入到对象上下文中,然后可以将其作为对象上下文中的方法调用:
string AppendNote(int key, string note)
{
using (MyEntities _Context = new MyEntities())
{
_Context.UpdateNote(key, note);
}
}
并且只会执行此单个SQL UPDATE语句 - 该行不会被不必要地传输到您的客户端。