【问题标题】:The change is not committed in a specific table on database after save change in Entity Framework在实体框架中保存更改后,未在数据库的特定表中提交更改
【发布时间】:2017-09-21 20:17:28
【问题描述】:

在这段代码中,我更改了Table1IsMale 字段和Table2Name 字段。

Table1 中的更改已应用,但 Table2 中的更改未应用。 context.SaveChanges() 返回 2Table2 未在数据库中更新 请帮帮我。

using (var context = new ctxdB())
{
    var tbl1 = context.Table1.FirstOrDefault(c => c.Token == token);
    var tbl2 = context.Table2.Find(id);

    tbl1.IsMale = true;
    tbl2.Name = "New name";

    context.Entry(tbl1).State = EntityState.Modified;
    context.Entry(tbl2).State = EntityState.Modified;

    context.SaveChanges();
}

【问题讨论】:

  • table2 上的Find 找到什么了吗?
  • @Locke125,当然可以。
  • 顺便说一句,在您使用 FirstOrDefault() 检索的实体上,您不必手动设置实体状态。
  • EF 上下文自动跟踪对象,以便知道哪个被修改。所以我认为你真的不需要将 State 设置为 EntityState.Modified。 SaveChanges() 方法还有一个整数返回值,它指示在保存期间有多少行受到影响。返回值是多少?
  • @Major context.SaveChanges() 返回 2 但 Table2 未在数据库中更新。

标签: c# asp.net sql-server asp.net-mvc entity-framework


【解决方案1】:

如果你看这里的条目:

https://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx

上面写着

"查找具有给定主键值的实体。如果上下文中存在具有给定主键值的实体,则立即返回,而不向商店请求。否则,向商店发出请求对于具有给定主键值的实体,如果找到该实体,则将其附加到上下文并返回。"

这告诉我它可能正在返回一个未连接的实体。您可以尝试在 Context.Table2 之外的实体上调用 Attach() 方法。

context.Table2.Attach(tbl2);

还有什么原因您不在该实体集上使用FirstOrDefault()?这应该会生成一个查询并将模型附加到实体集。

【讨论】:

  • 那就听从别人的建议,从S​​aveChanges()中打印出返回号,或者你可以试试 var tbl2 = context.Table2.FirstOrDefault(t => t.Id == id);
  • context.SaveChanges() 返回 2 但 Table2 未在数据库中更新。
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2014-06-16
  • 2019-01-31
相关资源
最近更新 更多