Каким образом правильный способ справляться с не отслеживающимися сущностями?
-
21-09-2019 - |
Вопрос
Самосъемки сущности. Потрясающий.
За исключением случаев, когда вы делаете что -то вроде
return Db.Users;
Ни одна из сущностей не отслеживает (до тех пор, возможно, они не будут опустошены).
Отлично. Таким образом, мы должны признать, что существует вероятность того, что сущность, возвращающаяся к нам, не включает отслеживание.
Что теперь???
Вещи, которые я пробовал
Для данного метода тела:
using (var db = new Database())
{
if (update.ChangeTracker.ChangeTrackingEnabled)
db.Configurations.ApplyChanges(update);
else
FigureItOut(update, db);
db.SaveChanges();
update.AcceptChanges();
}
Следующие реализации FigureItOut
все терпит неудачу:
db.Configurations.Attach(update);
db.DetectChanges();
Ни
db.Configurations.Attach(update);
db.Configurations.ApplyCurrentValues(update);
Ни
db.Configurations.Attach(update);
db.Configurations.ApplyOriginalValues(update);
Ни
db.Configurations.Attach(update);
db.Configurations.ApplyChanges(update
Ни о чем еще я могу подумать, чтобы бросить это, кроме как
- Получение оригинальной сущности из базы данных
- Сравнение каждого свойства вручную
- Обновление свойств по мере необходимости
Что именно я должен делать с самостоятельными сущностями, которые не отслеживают себя ??
Небольшое обновление:
Слебо отмечает сущность как модифицированные работы, однако это кажется немного вонючим. Это лучшее, что мы можем сделать в этом случае?
Решение
Сценарий 1
Вот несколько рекомендуемых практик, чтобы следовать. Когда вы используете STE в сценарии WCF, вы должны полагаться на трекер изменения, который реализует STE, так что на стороне сервера вы делаете следующее.
db.Users.ApplyChanges(user);
db.SaveChanges();
Сценарий 2 Однако, если вы находитесь на сервере, рекомендуемая практика состоит в том, чтобы создать метод в частичном классе для объекта, называемого enablechangeTracking. Метод будет запросить сущности, которые находятся в неизменном состоянии, которые реализуют iobjectwithchangeTracker и включают отслеживание изменений, так что что -то вроде этого
user = db.users.first(u => u.userid == 1);
db.EnableChangeTracking();
Теперь попробуйте сохранить пользовательский объект из другого контекста, из которого он был изначально извлечен из
db2.users.ApplyChanges(user);
db2.SaveChanges();
Сценарий 3 Если на стороне сервера вы подключены к тому же контексту объекта, из которого вы извлекили пользовательский объект, то вы используете STE как простой объект poco, как ниже ниже.
user = db.users.first(u => u.userid == 1);
user.LastName = "XYZ";
db.DetectChanges(); //no need for it cuz Savechanges implicitly calls this.
db.SaveChanges();
Сценарий 4 Если пользовательский объект извлечен из другого контекста, то контекст, который вы будете использовать для сохранения, то здесь есть еще один вариант, в котором вы отмечаете сущность как модифицированное и не заботятся о том, что было изменено.
user = db.users.first(u => u.userid == 1);
var db2 = new ObjectContext();
user.LastName = "XYZ";
db2.Users.Attach(user);
// i prefer this option..
db2.ObjectStateManager.ChangeObjectState(user,EntityState.Modified);
db2.SaveChanges(); // updates all columns
Сценарий 5 Если пользовательский объект извлечен из другого контекста, то контекст, который вы будете использовать для сохранения, вот еще один вариант, в котором вы получаете исходную сущность.
user = db.users.first(u => u.userid == 1);
user.lastName ="XYZ";
var db2 = new ObjectContext();
db2.Users.First(u => u.userid == user.userid);
db2.users.ApplyCurrentValues(user);
db2.SaveChanges();
Вот сообщение в блоге, в котором описывается несколько сценариев.http://weblogs.asp.net/zeeshanhirani/archive/2010/03/30/modifying-selfing-entity-on-the-server.aspx
Я широко освещаю эти концепции в моей организации.