在实体框架

时间:2016-10-06 08:25:24

标签: c# .net entity-framework ef-code-first

我有一个实体框架代码优先模型,其中每个实体实现以下接口:

public interface IEntity
{
    long Id { get; set; }
    DateTime DateTimeCreated { get; set; }
    DateTime DateTimeModified { get; set; }
}

DbContext中,我覆盖了执行以下操作的SaveChanges方法:

public override int SaveChanges ()
{
    PropertyInfo property = null;
    var interfaceName = typeof(IEntity<>).Name;

    this.ChangeTracker.DetectChanges();

    foreach (var entry in this.ChangeTracker.Entries())
    {
        var now = DateTime.Now;
        var type = entry.Entity.GetType();
        var @interface = type.GetInterface(interfaceName, false);

        if (@interface != null)
        {
            if (entry.State == EntityState.Added)
            {
                property = type.GetProperty("DateTimeCreated");
                property.SetValue(entry.Entity, now);
                property = type.GetProperty("DateTimeModified");
                property.SetValue(entry.Entity, now);
            }
            else if (entry.State == EntityState.Modified)
            {
                // The property [DateTimeCreated] gets reset to default(DateTime).
                property = type.GetProperty("DateTimeModified");
                property.SetValue(entry.Entity, now);
            }
        }
    }

    return (base.SaveChanges());
}

问题在于条件else if (entry.State == EntityState.Modified)

表示层使用ViewModel DTO,解决方案中大量使用自定义代码生成。因此,使用AutoMapper之类的工具并将IEntity接口值传播到DTO和从DTO传播都不理想。

当实体更新时,由于DTO对上述属性一无所知,IEntity实例的DateTimeCreated属性设置为default(DateTime)

IEntity界面旨在保护开发人员/消费者不必编写管道代码,因为我们不会传播DTO,唯一的另一个选择似乎是再次往返于数据库以获取DateTimeCreated值,然后调用base.SaveChanges

是否有一种解决方法可以避免我可能会错过的这次往返?

0 个答案:

没有答案