实体框架6 - GetObjectStateEntries预期修改实体具有状态"未更改"

 三少乾坤_943 发布于 2023-02-04 19:14

问题

当我创建我的帐户类作为示例A时,对象在我的SaveChanges() - 方法中按预期显示状态为"EntityState.Modified".

当我使用示例B时,该对象显示为"EntityState.Unchanged",并且在GetObjectStateEntries(EntityState.Added | EntityState.Modified)调用的结果中没有apear.

任何人都可以向我解释,为什么模型对象在示例B中看起来没有变化,而一切都在示例A中有效?

谢谢

我在Context对象中使用此方法更新'Created'和'LastUpdated':

public class CrmContext : DbContext
{

public override int SaveChanges()
{
    DateTime now = DateTime.Now;
    foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
    {
        if (!entry.IsRelationship)
        {
            var account = entry.Entity as Account;
            if (account != null)
            {
                account.LastUpdated = now;
                if (entry.State == EntityState.Added)
                {
                    account.Created = now;
                }
            }
        }
    }

    return base.SaveChanges();
}

}

模型示例A(工作):

public class Account
{
 [Key]
 public int AccountId { get; set; }
 public string Name { get; set; }
 [Timestamp]
 public Byte[] TimeStamp { get; set; }
 public DateTime Created { get; set; }
 public DateTime LastUpdated { get; set; }
}

模型示例B(不工作):

public class Account : BaseObject
{
 [Key]
 public int AccountId { get; set; }
 public string Name { get; set; }
}
public class BaseObject
{
 [Timestamp]
 public Byte[] TimeStamp { get; set; }
 public DateTime Created { get; set; }
 public DateTime LastUpdated { get; set; }
}

更新:

该问题似乎与模型类是否继承自基类有关,因为我不能在不使用建议的DetectChanges()调用的情况下重现工作示例.

1 个回答
  • 您应该在重写SaveChanges方法的开头手动调用更改检测:

    public override int SaveChanges()
    {
        this.ChangeTracker.DetectChanges();
    
        //...
    }
    

    我没有解释为什么实体状态可能与模型A和模型B不同.但是缺少调用DetectChanges通常可能是实体处于状态Unchanged(暂时)的原因,尽管它已被修改.例如,如果你有POCO实体(不是更改跟踪代理),只需加载一个实体,更改一个属性,然后调用你的被覆盖SaveChanges状态,Unchanged 直到 base.SaveChanges被调用,这将更新状态Modified并将更改保存到数据库.但是,设置LastUpdated属性的代码将被跳过,并且LastUpdated在数据库中具有旧值.

    2023-02-04 19:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有