为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架写入上下文而不是数据库

实体框架写入上下文而不是数据库

C#
哈士奇WWW 2021-10-23 16:43:20
我们对基于 EF 6.2.0 的 C# 应用程序使用 UnitOfWork 方法,并使用 SQL Server 2017 Express (14.0.1000) 数据库后端。我们OwnContext.cs继承自DbContext应该填充字段Id,ChangedDate并且ChangedUser自动地,这是我们数据库模型中每个实体的一部分:public partial class OwnContext : DbContext {    public override int SaveChanges()    {        bool hasChanges = false;        this.ChangeTracker.DetectChanges();        #region Fill Created, Changed        foreach (var item in this.ChangeTracker.Entries()            .Where(x => (x.State == EntityState.Added || x.State == EntityState.Modified || x.State == EntityState.Deleted)))        {            if (item.State == EntityState.Deleted)            {                hasChanges = true;            }            else            {                // Id                PropertyInfo pI = item.Entity.GetType().GetProperty("Id");                if (pI != null)                {                    Guid id = (Guid)pI.GetValue(item.Entity, null);                    if ((Guid)id == Guid.Empty)                    {                        id = Guid.NewGuid();                        pI.SetValue(item.Entity, id);                    }                }适用于完美运行的新记录,但不适用于修改后的记录。ChangedDate字段中的新日期时间值仅出现在上下文中,但不会写入数据库。如果我单步执行代码,我会看到item.StateisEntityState.Modified并且countChanges返回值为 1 并且item.Entity所有内容中的值似乎都是正确的。如果查询对象,新值是可见的,但数据库中的值不会改变,所以如果我处理我的上下文,旧值将重新出现。让人有些困惑的是,在用户界面中的字段的值更改测试它是在db改变了,但现场ChangedDate。为什么?
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

此时,更改跟踪器接收到的实体对象上的属性更改与 DTO 无关。您需要改为通过DbEntityEntry.CurrentValues属性应用更改。

item.CurrentValues["ChangedDate"] = DateTime.Now;


查看完整回答
反对 回复 2021-10-23
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信