c# - 通用检查 Entity Framework 和存储库模式是否发生了变化

标签 c# entity-framework generics repository

我的更新方法将始终更新,因为我必须设置 LastModified 日期。我想知道是否有一种方法可以动态检查某些值是否已更改。

我的状态对象是这样的:

public partial class Action : IEntity
{
    public long Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public System.DateTime Created { get; set; }
    public System.DateTime LastModified { get; set; }
    public Nullable<System.DateTime> Deleted { get; set; }
}

我使用的界面如下所示:

public interface IEntity
{
    long Id { get; set; }        
    DateTime Created { get; set; }
    DateTime LastModified { get; set; }
    DateTime? Deleted { get; set; }       
}

我的更新方法如下所示(稍后保存更改):

    public virtual void Update(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        var attachedEntity = DbSet.Find(entity.Id);

        if (attachedEntity != null)
        {
            var attachedEntry = DbContext.Entry(attachedEntity);

            entity.Created = attachedEntity.Created;
            entity.LastModified = DateTime.Now;

            attachedEntry.CurrentValues.SetValues(entity);
        }
        else
        {
            dbEntityEntry.State = EntityState.Modified;
            entity.LastModified = DateTime.Now;
        }
    }

因此,它实际上会对通过 IEntity 接口(interface)作为 T 传递的每个对象执行一般更新。但是,它会在每次调用此方法时执行更新,因为 LastModified 值已更改。导致像这样的许多更新查询:

exec sp_executesql N'update [dbo].[BiztalkEntity]
set [LastModified] = @0
where ([Id] = @1)
',N'@0 datetime2(7),@1 bigint',@0='2013-05-17 11:22:52.4183349',@1=10007

你能告诉我如何防止每次都执行查询吗?

最佳答案

我建议您延迟 LastModified 的设置,让 Entity Framework 在将更改发送到数据库之前为您提供所有已更改的实体。

您可以覆盖 DbContextSaveChanges() 方法

public class MyContext : DbContext
{
    public override int SaveChanges()
    {
        //you may need this line depending on your exact configuration
        //ChangeTracker.DetectChanges();
        foreach (DbEntityEntry o in GetChangedEntries())
        {
            IEntity entity = o.Entity as IEntity;
            entity.LastModified = DateTime.Now;
        }
        return base.SaveChanges();
    }

    private IEnumerable<DbEntityEntry> GetChangedEntries()
    {
        return new List<DbEntityEntry>(
            from e in ChangeTracker.Entries()
            where e.State != System.Data.EntityState.Unchanged
            select e);
    }
}

关于c# - 通用检查 Entity Framework 和存储库模式是否发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605834/

相关文章:

c# - 升级到 EntityFramework 6.1.3,现在收到上下文异常

generics - Rust image::SubImage,找不到类型为 `put_pixel`的方法吗?

c# - 如何在 Visual Studio 2015 上的 ASP.NET Core 中创建 T4 文本模板 (.tt)

C# 获取两个匹配列表的差异

c# - 使用 Global.asax 添加并读取列表<t>

C# ADO.NET 插入具有默认值的新行

c# - Nuget.Server 可以列出包,但在包安装时出现 404

c# - .edmx 文件是否在现实世界中使用

android - Kotlin 泛型继承问题

Scala:A 扩展 Ordered[A]