在实体框架中执行最小更新

时间:2011-09-07 20:42:59

标签: entity-framework

我想要的要附加到记录的备注列。

我不想要做的是获取整个记录,这是非常重要的。

这是工作的代码:

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?但是,似乎还有 一种方式。

3 个答案:

答案 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语句 - 该行不会被不必要地传输到您的客户端。