【问题标题】:Entity Framework InvalidOperationException when updating an item更新项目时的实体框架 InvalidOperationException
【发布时间】:2013-12-19 04:10:13
【问题描述】:

我收到一个System.InvalidOperationException 错误,其中指出:

附加信息:无法调用成员“IsModified” 属性“状态”,因为“电池项”类型的实体不 存在于上下文中。要将实体添加到上下文中,请调用 Add 或 DbSet的附加方法。

我没有做到这一点吗?这是我下面的方法:

public void UpdateBatteryState(BatteryItem batItem, BatteryState state)
{
    try
    {
        batItem.state = state.ToString();
        context.BatteryItem.Attach(batItem);
        var entry = context.Entry(batItem);
        entry.Property(x => x.state).IsModified = true;

        Save();
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
     }
}

【问题讨论】:

  • 为什么还要手动设置 IsModified 属性? EF 内置了更改跟踪。

标签: c# entity-framework


【解决方案1】:

根据该信息,您应该这样做:

public void UpdateBatteryState(BatteryItem batItem, BatteryState state)
{
    try
    {

        context.BatteryItem.Add(batItem);
        batItem.state = state.ToString();

        context.SaveChanges()
     }
     catch (Exception e)
     {
         Console.WriteLine(e.Message);
     }
}

【讨论】:

  • 已更新。没有bi,只有batteryItemstate 不是模型,它是 DB 中的 varcharBatteryState 是枚举。
  • context.BatteryItem.Attach(batItem);将其更改为 context.BatteryItem.Add(batItem);
  • 为什么是Add?我不想将新对象放入数据库中,而是要更新当前对象?
  • Add 不会将新对象放入数据库中。 SaveChanges() 将。
  • @Nikola,对不起,我错过了那个,你尝试删除 entry.Property(x => x.state).IsModified = true;并将其更改为 entry.State = EntityState.Modified;
【解决方案2】:

我先调用EntityState.Modified 来修复它,然后禁用对属性的修改,如下所示:

db.Entry(obj).State = EntityState.Modified;
db.Entry(obj).Property(x => x.Password).IsModified = false;

【讨论】:

  • @DownVoter,你能解释一下这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多