如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?

Posted

技术标签:

【中文标题】如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?【英文标题】:How to push modified record to DB using dbcontext SaveChanges? 【发布时间】:2017-02-01 11:01:26 【问题描述】:

我在本地修改了一个对象,然后将其传递给 DAL 以在连接的数据库上进行更新。

通常我会使用存储过程并执行读取器来更新数据库,但这个项目改为实现数据库上下文。

但是当我运行该方法来保存更改时,它返回时没有错误,并且数据库中的记录没有更新。

在这里搜索我遇到this question 建议在调用保存之前将数据库记录标记为修改状态。哪个没有纠正问题。

问题:

这是 DAL 方法的要点:

public void update_Release_Status(Status recordModified)


          //Get the original record and update with the modified values.

        Status recordOriginal = db3.Status .First(i => i.ID == recordModified.ID);
        db3.Entry(recordOriginal).State = System.Data.Entity.EntityState.Modified; //marked as modified here before saving
        recordOriginal = recordModified;
        db3.SaveChanges();



【问题讨论】:

您实际上从未对recordOriginal 的实例进行任何更改,因此无需更新。您可以在recordOriginal 上设置单个字段而不是完全替换变量引用吗?或者,如果它最初来自数据库上下文,您可以将 recordModified 附加到上下文中? (它是从哪里来的?) 这个解决方案对你有用还是什么? ***.com/a/39663331/1077309 【参考方案1】:

你的实体是connected(或tracked)之一。所以你不需要这样做db3.Entry(recordOriginal).State = System.Data.Entity.EntityState.Modified;

注意:您必须将传入对象的属性映射到获取的对象。您可以使用 Mapper API 或手动执行此操作,如下所示。

public void update_Release_Status(Status recordModified)


    Status recordOriginal = db3.Status.First(i => i.ID == recordModified.ID);

    recordOriginal.Name = recordModified.Name;//here you have to do the mapping
    recordOriginal.Age=recordModified.Age; //just used fake property names :)

    db3.SaveChanges();


【讨论】:

这不会有完全相同的问题吗?从 DB 上下文中获取的实际对象永远不会被修改。没有要保存的更改。 这是修改部分recordOriginal = recordModified;。来自他的方法。@David 是的,但recordModified 是否完全附加到数据库上下文?遇到的问题意味着它不是。如果是的话,为什么还要获取一个单独的实例呢?本质上,您是从数据库上下文中获取一个对象,然后从不对该对象做任何事情。那么为什么要拿它呢?您在此处显示的整个方法可以简化为仅最后一行。 无需将此recordModified 附加到context。因为我们正在更新attached or tracked recordOriginal 实体。就像这样,比如说recordOriginal.Name="David"; 然后db3.SaveChanges();。就是这样。 @大卫 这不是引用变量在 C#(或我见过的任何语言)中的工作方式。 recordOriginal = recordModified; 不会单独更新recordOriginal 上的属性以匹配recordModified 上的属性,它只是更新变量引用本身以指向另一个对象。因此,recordOriginal 变量之前引用的实际对象仍然在堆上,未修改,并且可以立即用于垃圾回收,因为没有对它的引用。

以上是关于如何使用 dbcontext SaveChanges 将修改后的记录推送到数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在控制器中使用多个 DBContext

使用 Lazyloading,如何在处理完其 DBContext 后使用新的 DbContext 加载相关对象?

如何使用 Net Core 在 DbContext 中获取用户信息

如何刷新实体框架核心 DBContext?

如何使用 Dbcontext 添加条目

如何在 T4 模板中使用 DbContext?