【问题标题】:Entity Framework - Deleting Split entity is not attached and it was not loaded by the same context instance实体框架 - 未附加删除拆分实体,并且它不是由相同的上下文实例加载
【发布时间】:2014-06-16 11:48:25
【问题描述】:

当我将关系声明为拆分表时,从实体框架中删除关系时遇到问题。

基本上我需要一些代码来检查实体是否由相同的上下文加载。下面的检查不起作用。

var data = new ProductItemData() { Id = pv.ProductItems[i].Id };

if (m_Context.ProductData.Where(w => w.Id == data.Id).Count() == 0)
{
   m_Context.ProductData.Attach(data);
}

m_Context.ProductData.Remove(data); 

当它没有在相同的上下文中加载时,即数据已经从数据库中延迟加载,我正确地得到了这个错误

无法删除该对象,因为它在 对象状态管理器。

并且当item在同一个上下文中并且attach()方法被执行时。我收到此错误

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法使用相同的 key 跟踪多个对象

有人对我能做的支票有什么想法吗?

我认为它忽略了我所做的任何检查..当我重新加载上下文时它会很好地删除它,但在相同的上下文中,它总是转到附加代码

谢谢

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    如果您使用.ToList,那么您将强制运行时激活 sql 查询(急切的方式)。

    试试:

    List<ProductData> data = m_Context.ProductData.Where(w => w.Id == data.Id).ToList();
    
    if (data.Count() == 0)
    {
       m_Context.ProductData.Attach(data);
    }
    
    m_Context.ProductData.Remove(data); 
    

    您可以尝试以下操作(取自here),而不是附加:

    context.Entry(oldEntity).CurrentValues.SetValues(newEntity);
    

    【讨论】:

      【解决方案2】:

      如果您想检查给定实体的实体状态,请使用更改跟踪器:

      if(m_Context.Entry(someEntity).State == EntityState.Detached)
      {
          // entity was not added by this context or it is brand new and not added to a dbset
      }
      

      以下是EntityState 的不同值:

      • 添加:实体正在被上下文跟踪,但在数据库中尚不存在。
      • 已删除:实体正在被上下文跟踪并存在于数据库中,但已标记为在下次调用 SaveChanges 时从数据库中删除。
      • 已分离:上下文未跟踪实体。使用 new 运算符或使用 DbSet Create 方法之一创建实体后,它立即处于此状态。
      • 已修改:实体正在被上下文跟踪并存在于数据库中,并且其部分或全部属性值已被修改。
      • 未更改:实体正在被上下文跟踪并存在于数据库中,并且其属性值与数据库中的值没有变化。

      【讨论】:

      • 谢谢,这是有道理的,但是,我认为它忽略了我所做的任何检查(上面的代码符合要求)当我重新加载上下文时它可以很好地删除它但是当在相同的上下文中时,它总是会继续到附加代码,然后是错误。
      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 2015-10-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多