Как я могу обновить одно поле из сущности с Entity Framework?

Мне нужно загрузить объект из базы данных, изменить некоторые его поля и отношения, а затем я хочу сохранить новое значение только для одного поля без изменения остальных.

Это будет выглядеть примерно так:

var thing = db.Things.First();

thing.Field1 = "asdas";
thing.Field2 = 23;
thing.OtherThings.Add(new OtherThing());
thing.FieldToUpdate = doSomething(thing);

db.SaveChanges();

Но это сохранит все изменения, я хочу только сохранить FieldToUpdate...

Я огляделся по сторонам, и все, что я нашел, - это использовать хранимые процедуры, которые кажутся слишком большими для чего-то, что выглядит так просто, кроме того, мне нужно было бы создавать разные хранимые процедуры каждый раз, когда мне нужно что-то подобное сделать...

Мое текущее решение состоит в том, чтобы открыть другой контекст, загрузить его снова, обновить FieldToUpdate и SaveChanges, но это неэффективно и уродливо.

2 ответа

Если вы хотите сделать это с присоединенным объектом, вы должны обновить FieldToUpdate FIRST и вызвать SaveChanges. Затем вы можете обновить другие поля и снова вызвать SaveChanges, если это необходимо. Нет другого способа с прикрепленной сущностью.

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

// I suppose that db is ObjectContext or inherited type
db.ObjectStateManager.GetObjectStateEntry(thing).SetModifiedProperty("FieldToUpdate");

Теперь только FieldToUpdate отслеживается как измененный.

Entity Framework достаточно умен, чтобы выяснить, что изменилось, а что нет, и оптимизировать оператор SQL, соответственно. Если вы измените только FieldToUpdate, оператор SQL будет обновлять только одно поле, а не все.

Однако, если вы измените Field1 и Field2 по сравнению с тем, чем они были изначально, они также будут сохранены, но ТОЛЬКО если они изменились. В противном случае нет необходимости указывать БД, чтобы она изменилась на ту, которая уже есть.

Entity Framework делает это таким образом, потому что это именно то, что разработчик хочет в 99,9% случаев. Если вы собираетесь использовать объект-сущность в качестве объекта, который вы хотите перемещать и манипулировать другими способами, а не рассматривать его как модель базы данных (как это и должно быть), то вы можете рассмотреть возможность создания другого нового класса-оболочки это позволяет вам связываться со всеми полями данных, которые вы хотите (и есть другие, которых там нет), а затем использовать метод save, обеспечивающий надлежащее постоянство структуры сущности, чтобы держать вещи отдельными и чистыми.

Другие вопросы по тегам