2011-09-07 2 views
0

Что я хочу, чтобы добавить в столбец примечаний к записи.Выполнение минимального обновления в инфраструктуре Entity

То, что я не хочу сделать, это извлечь всю запись, что очень важно.

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

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?, но, тем не менее, кажется, что имеет быть путь.

ответ

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

Я просто * знал * это было возможно. –

1

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

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

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

+0

Я надеялся, что вы были не правы; это также раздражает, что это возможно с Linq to SQL. Но что есть, то есть. Спасибо за ваши отзывы об этом. –

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

и только будет выполняться это один оператор UPDATE SQL - строка не будет передана вашему клиенту без необходимости.

+0

+1 Хранимая процедура - это лучший подход ИМХО. –

Смежные вопросы