【问题标题】:How to change state of an entity which multiple objects are referring to it?如何更改多个对象引用的实体的状态?
【发布时间】:2017-09-25 08:19:14
【问题描述】:

我有一个名为“SPs”的对象,它指的是存储在 db 中的所有供应商的库存产品列表。

在我的操作中,我需要创建一个名为“PSPs”的新对象,它根据当前提供者的 ID 过滤 SP:

Public ActionResult Edit(int id, int pid)
{
   var SPs = dbContext.Products.Where(o => o.ID == id).Select(o => o.SPs).ToList();
   // do something based on SPs
   ...
   var PSPs = Filter(SPs, pid);
   // edit all PSPs

我尝试更改 PSP 引用的实体的状态,如下所示:

    PSPs.ForEach(o => { 
       dbContext.Entry(o).State = EntityState.Modified;
    }
}

但收到如下消息的异常:

附加类型为“SP”的实体失败,因为另一个实体 相同类型已经具有相同的主键值。

更多,这里是产品类中的 SP 导航属性:

public ICollection<SP> SPs { get; set; }

和SP类:

public class StockProduct
{
     [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public int SPID { get; set; }

     [ForeignKey("Product")]
     public int ProductID { get; set; }
     public Product Product { get; set; }

     [ForeignKey("Provider")]
     public int ProviderID { get; set; }
     public Provider Provider { get; set; }
     ...
}

那么,有什么想法吗?

【问题讨论】:

  • 我认为在您的表格中,您的 State 字段存在唯一约束。
  • 我们可以看看你的产品类吗?
  • @GGO:这不是我们应该看的SP 类吗?
  • 是的,你是对的
  • @CoskunOzogul:状态不是对象本身的属性,而是 DbContext 中 DbSet 条目的属性。它没有映射到 Db 列,因此不能具有唯一约束。关于手头的问题:我相信错误来自显示的另一个代码片段。 .Entry() 调用附加对象,如果它不在调用之前的上下文中;但是,从代码片段来看,这是可以预料的。如果您创建新的 PSP 对象,请确保返回到 SP 的导航属性为空(尽管您可以设置 FK),然后再将其附加到上下文。

标签: c# asp.net entity-framework


【解决方案1】:

事实证明,您在ChangeTracker 中有另一个SP 实例。您需要分离另一个实例,然后才能附加新实例。

异常本身是描述性的:您不能附加具有重复Primary Keys 的实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2020-05-01
    • 2021-04-22
    相关资源
    最近更新 更多