Как я могу обновить одно поле из сущности с Entity Framework? - PullRequest
1 голос
/ 16 сентября 2010

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

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

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 ]

2 голосов
/ 17 сентября 2010

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

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

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

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

0 голосов
/ 16 сентября 2010

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

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

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

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