如何处理修改过的实体记录

本文关键字:实体 记录 修改 何处理 处理 | 更新日期: 2023-09-27 17:50:58

现在检查我的实体框架对象的变化,我检查数据库,我遍历每个对象,并与更新的属性进行比较,如果它们更新了,那么我修改的日期也将更新。

我发现它在代码中变得非常长,并且想知道是否有一种更干净的方法来检查使用实体框架的更改。我在想也许使用deepcopy与对象比较和比较下面的东西。但是我必须把每个表都序列化我不知道这是不是件好事。

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

我当前跟踪更改的方法

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

if语句是一个代码片段,我的实体有很多属性,所以它变得很长…

如何处理修改过的实体记录

你可以给你的实体一个带有CreatedDateModifiedDate属性的接口:

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

然后覆盖DBContext中的SaveChangesSaveChangesAsync,处理自动更新添加和修改实体的属性:

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;
    }
}

你可以试试

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

实体框架在DbContext中有一个ChangeTracker。

例如,我重写了上下文的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)的更多信息