4

Self отслеживания объектов. Потрясающие.Каков правильный способ обработки объектов отслеживания без отслеживания?

исключения случаев, когда вы делаете что-то вроде

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 всех FAIL:

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. Получение исходного объекта из базы данных
  2. Сопоставляя каждое имущество вручную
  3. Обновление свойств по мере необходимости

Что именно я должен делать с объектами самоконтроля, которые не отслеживают себя?


Небольшое обновление:

Слепо маркировка объекта как модифицированные работы, однако это кажется немного вонючим. Это лучшее, что мы можем сделать в этом случае?

+0

Вздох, кажется, у меня есть, но опять же, пошел, где, по крайней мере, не так много, ушел раньше. – Will

ответ

6

сценарий 1

Ниже приведены некоторые рекомендуемые практики. Когда вы используете STE в сценарии WCF, вы должны полагаться на отслеживатель изменений, который STE реализует, поэтому на стороне сервера вы делаете следующее.

db.Users.ApplyChanges(user); 
db.SaveChanges(); 

сценарий 2 Однако, если вы находитесь на сервере, рекомендуемая практика заключается в создании метода на разделяемый класс для ObjectContext называется EnableChangeTracking.Метод будет запрашивать для субъектов, которые находятся в неизменном состоянии, реализующий IObjectWithChangeTracker и включает отслеживание изменений так что-то вроде этого

user = db.users.first(u => u.userid == 1); 
db.EnableChangeTracking(); 

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

db2.users.ApplyChanges(user); 
db2.SaveChanges(); 

сценарий 3 если на стороне сервера, вы подключены к одному контексту объекта, из которого вы извлечены объект пользователя с, а затем использовать STE, как простой росо объект как ниже

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 , если пользовательский объект извлекается из другого контекста, тогда контекст u будет использовать его для сохранения, а вот еще один вариант, где u помещает объект как измененный и не заботится о том, что изменилось.

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-self-tracking-entity-on-the-server.aspx

Я подробно рассмотрим эти понятия в моем Entity Framework 4.0 рецептов книги с большим количеством сценариев ..

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

  • Нет связанных вопросов^_^