【发布时间】: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