【问题标题】:ChangeTracker.Entries() always nullChangeTracker.Entries() 始终为空
【发布时间】:2019-08-30 06:40:14
【问题描述】:

我的家庭作业项目有问题。使用实体框架 6.2.0 。我有一些从 IEntity 接口继承的实体

public interface IEntity
{
    int Id { get; set; }
    DateTime CreateDate { get; set; }
    DateTime UpdateDate { get; set; }
}

我希望 CreateDate 和 UpdateDate 在保存更改时自动分配,所以我在我的上下文中覆盖了 SaveChanges() 方法

public override int SaveChanges()
{
    ChangeTracker.DetectChanges();
    var entityEntries = ChangeTracker.Entries(); //null
    //var entityEntries = ChangeTracker.Entries<IEntity>(); this is null, too
    //var entityEntries = ChangeTracker.Entries().Where(entity => entity is IEntity); I tried to uses this, entityEntries still null

    foreach (var entity in entityEntries)
    {
        if (entity is IEntity autoEntry)
        {
            if (entity.State == EntityState.Added)
            {
                autoEntry.CreateDate = DateTime.Now;
                autoEntry.UpdateDate = DateTime.Now;
            }
            else
            {
                autoEntry.UpdateDate = DateTime.Now;
            }
        }
    }
    return base.SaveChanges();
}

但entityEntries 始终为空,因此我无法将值设置为CreateDate 和UpdateDate 属性。我的 foreach 循环从未运行。

下面是我的上下文类

public class KarnelContext : DbContext
{
    public DbSet<Account> Accounts { get; set; }
    public DbSet<Role> Roles { get; set; }

    public KarnelContext() : base("name=learningDB")
    {
    }
    public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();
        var entityEntries = ChangeTracker.Entries<IEntity>();
        //var entityEntries = ChangeTracker.Entries().Where(entity => entity is IEntity);

        foreach (var entity in entityEntries)
        {
            if (entity is IEntity autoEntry)
            {
                if (entity.State == EntityState.Added)
                {
                    autoEntry.CreateDate = DateTime.Now;
                    autoEntry.UpdateDate = DateTime.Now;
                }
                else
                {
                    autoEntry.UpdateDate = DateTime.Now;
                }
            }
        }
        return base.SaveChanges();
    }
}

我的代码有什么问题?

感谢您的帮助

【问题讨论】:

  • 请显示您的 Context 类,这些信息不足以知道是什么问题
  • 我添加了我的上下文类@EhsanSajjad
  • 您的实体正在实施 IEntity 权利以及您如何调用上下文?
  • 是的,我的实体正在实现IEntity,我通过var context = new KarnelContext() 调用上下文然后context.Accounts.Add(account);
  • 如果省略 DetectChanges() 调用会发生什么?在您的场景中,这无关紧要(无论如何它都会在之后被调用,并且添加的状态不是由 ChangeTracker 设置的)。

标签: c# .net entity-framework


【解决方案1】:

我发现了一个问题

public override int SaveChanges()
{
    ChangeTracker.DetectChanges();
    var entityEntries = ChangeTracker.Entries(); //null
    //var entityEntries = ChangeTracker.Entries<IEntity>(); this is null, too
    //var entityEntries = ChangeTracker.Entries().Where(entity => entity is IEntity); I tried to uses this, entityEntries still null

    foreach (var entity in entityEntries)
    {
        if (entity is IEntity autoEntry)// <- Problem here, since enity never be IEntity type. 
        //Should change to entity.Entity is IEntity autoEntry
        {
            if (entity.State == EntityState.Added)
            {
                autoEntry.CreateDate = DateTime.Now;
                autoEntry.UpdateDate = DateTime.Now;
            }
            else
            {
                autoEntry.UpdateDate = DateTime.Now;
            }
        }
    }
    return base.SaveChanges();
}

我仍然不明白为什么entityEntries = ChangeTracker.Entries&lt;IEntity&gt;(); 在我添加观看时总是为空。但是我关于自动日期时间的问题已经解决了。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 2019-07-18
    • 2019-08-18
    • 2011-12-29
    • 2019-07-02
    • 2019-05-04
    • 1970-01-01
    • 2011-05-04
    • 2015-10-29
    相关资源
    最近更新 更多