2015-05-28 2 views
3

На данный момент, чтобы проверить изменения в объекте каркаса объекта, я проверяю базу данных, и я просматриваю каждый объект и сравниваю свойства с обновленным, если они обновляются, а моя дата изменена также будут обновлены.Как обрабатывать записи измененных объектов

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

if (Equals(oldentity, newentity)) 
{ 
    newentity.ModifiedDate = DateTime.Now 
} 

Мой текущий метод отслеживания изменений

if (oldentity.firstname != newentity.firstname || oldentity.lastname != newentity.lastname) 
{ 
    newentity.ModifiedDate = DateTime.Now 
} 

Условный утверждение сниппет, моя сущность обладает многими свойствами, поэтому он получает длительный ...

+0

Должно ли измененная дата всегда обновляться в любое время, когда объект сохраняется, независимо от того, какие значения изменены? – David

+0

Используете ли вы Entity Framework? Если это так, 'EntityState' должен сказать вам, был ли объект изменен, если нет, то я бы использовал отражение для проверки всех свойств и сравнения. –

+0

Вы можете посмотреть на этот ответ, как [проверить общий способ] (http://stackoverflow.com/a/29995396/3790486) все свойства объекта. – adricadar

ответ

1

Вы можете дать вашей организации интерфейс с CreatedDate и ModifiedDate свойств:

public interface ITrackedEntity 
{ 
    DateTime CreatedDate { get; set; } 
    DateTime ModifiedDate { get; set; } 
} 

Затем переопределить SaveChanges и SaveChangesAsync в DBContext для обработки обновления свойств для дополнительного и измененных объектов автоматически:

public override int SaveChanges() 
{ 
    this.UpdateTrackedEntities(); 
    return base.SaveChanges(); 
} 

public override async Task<int> SaveChangesAsync() 
{ 
    this.UpdateTrackedEntities(); 
    return await base.SaveChangesAsync(); 
} 

private void UpdateTrackedEntities() 
{ 
    var entities = ChangeTracker.Entries().Where(x => x.Entity is ITrackedEntity && (x.State == EntityState.Added || x.State == EntityState.Modified)); 

    foreach (var entity in entities) 
    { 
     if (entity.State == EntityState.Added) 
     { 
      ((ITrackedEntity)entity.Entity).CreatedDate = DateTime.UtcNow; 
     } 

     ((ITrackedEntity)entity.Entity).ModifiedDate = DateTime.UtcNow; 
    } 
} 

Делает вещи намного проще.

+0

Идею этого можно найти здесь [http://stackoverflow.com/а/16557167/188246). –

+0

Привет, Дэвид, я чувствую, что это обновление будет изменено в любое время. Я пытаюсь обновить его, только когда свойства были обновлены. Разве я не понимаю код неправильно? – Master

+0

@Master Я думаю, что если объект не был изменен, он будет иметь состояние 'EntityState.Unchanged', но я не проверил тест, чтобы проверить его. Проверка 'x.State == EntityState.Added || x.State == EntityState.Modified' должен обновлять только добавленные или измененные объекты. –

0

Вы можете попробовать что-то вроде

public bool HasUnsavedChanges(MyObject oldentity) 
{ 
    return (YourObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Any(x=>x.Id == oldentity.Id)); 
} 
0

В Entity Framework есть ChangeTracker в DbContext.

Я, например, переопределяю SaveChanges моего контекста(), и он может получить все изменения, внесенные в мои объекты.

public override int SaveChanges() 
{ 
    ChangeTracker.DetectChanges(); 
    var addedEntities = ChangeTracker.Entries().Where(x => x.State == EntityState.Added).ToList(); 
    var modifiedEntities = ChangeTracker.Entries().Where(x => x.State == EntityState.Modified).ToList(); 
    var deletedEntities = ChangeTracker.Entries().Where(x => x.State == EntityState.Deleted).ToList(); 

    //Save info generating the ids 
    var ret = base.SaveChanges(); 

    //Generate Logs logic 
    ... 

    return ret; 
} 

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

Более подробная информация о ChangeTracker (https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbchangetracker(v=vs.113).aspx)