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

时间:2015-05-28 14:06:22

标签: c# entity-framework

目前检查我的实体框架对象的更改,我检查数据库,然后检查每个对象并将属性与更新后的内容进行比较,如果它们已更新,那么修改后的日期也将更新。 / p>

我发现它在代码中变得非常冗长,并且想知道是否有更简洁的方法来检查使用实体框架的更改。我在考虑使用带有对象比较的深度复制并比较下面的内容。但我必须将每个表格都设置为序列化,我不知道这是不是一件好事。

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

我目前的跟踪变化方法

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

if语句是一个片段,我的实体有很多属性,所以它很长......

3 个答案:

答案 0 :(得分:1)

您可以为实体提供包含CreatedDateModifiedDate属性的界面:

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

然后覆盖SaveChanges中的SaveChangesAsyncDBContext,以便自动更新已添加和已修改实体的属性:

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

使事情变得更加简单。

答案 1 :(得分:0)

您可以尝试类似

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

答案 2 :(得分:0)

Entity Framework在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

的更多信息