EF Code-First外键创建重复数据
本文关键字:数据 创建 Code-First EF | 更新日期: 2023-09-27 18:12:08
我在Code-First ForeignKey上遇到了一些麻烦。我有一个如下所述的Product,我正在尝试用现有的Product创建一个新的LineItem。但是,当我将更改保存到我的上下文时,它创建了一个全新的Product,但是是我最初使用的产品的副本,除了id是新的(现在数据库中的新记录)。
我在这里添加了一个新的行项:
public void AddItem(Product item) {
// checking item.Id here will return 100
var lineItem = new LineItem
{
CartId = this.Id,
Product = item,
ProductId = item.Id,
Quantity = 1
};
_db.LineItems.Add(lineItem);
_db.SaveChanges();
// checking lineItem.Id here returns 101
// also checking item.Id here now also returns 101
this.LineItems.Add(lineItem);
}
public class LineItem {
[Key]
[Required]
public int Id { get; set; }
[Required]
public int CartId { get; set; }
[Required]
public int ProductId { get; set; }
[Required]
public int Quantity { get; set; }
[ForeignKey("CartId")]
public virtual Cart Cart { get; set; }
[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
}
为什么要创造一个新产品?
根据注释,您正在使用产品对象的未附加副本。因此EF将其视为附加的新实例(通过LineItem.Product
setter中生成的代码),并相应地插入它。
你可以像这样重新附加你的实体
_db.Products.Attach(product);
您的问题的另一个解决方案可能是将相同的上下文传递给AddItem
方法,因为您已经添加了Products
。这样,您就可以确保用于LineItems
的上下文不会被分离,EF也不会看到需要再次添加Products
(或任何其他实体)。
最诚挚的问候,
Adi江诗丹顿