Каким образом правильный способ справляться с не отслеживающимися сущностями?

StackOverflow https://stackoverflow.com/questions/2495405

Вопрос

Самосъемки сущности. Потрясающий.

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

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

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


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

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

Это было полезно?

Решение

Сценарий 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

Я широко освещаю эти концепции в моей организации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top