Выполните минимальное обновление в Entity Framework - PullRequest
0 голосов
/ 08 сентября 2011

То, что я хочу сделать, это добавить к столбцу заметки записи.

Что я не хочу , это получить всю запись, что оченьзначительный.

Вот код, который не работает:

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();
    }
}

Как правильно?

Я понимаю,это очень похоже на этот ОЧЕНЬ СТАРЫЙ вопрос: Оператор обновления с помощью Entity Framework и этот похожий, но в конечном счете несходный вопрос: Как обновить запись, не выбирая эту запись снова в ADO.NET Entity Framework? но, тем не менее, кажется, имеет путь.

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Что касается простых минимальных обновлений в 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 голос
/ 08 сентября 2011

Самый простой способ сделать это с 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 - строка не будет передана вашему клиенту без необходимости.

1 голос
/ 08 сентября 2011

Это невозможно с Entity Framework afaik. Единственная оптимизация, которую вы можете сделать, - это ленивая загрузка всех свойств, которые вызывают "значительную нагрузку" при загрузке объекта записи, и обновление объекта без их загрузки.

Если вы хотите избежать загрузки сущности в первую очередь, вы можете использовать ExecuteStoreQuery() для непосредственного выполнения SQL для этих критических для производительности обновлений.

В конце концов, EF - это ORM, который значительно упрощает CRUD, но вы платите цену производительности, используя эту абстракцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...