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 Code-First外键创建重复数据

根据注释,您正在使用产品对象的未附加副本。因此EF将其视为附加的新实例(通过LineItem.Product setter中生成的代码),并相应地插入它。

你可以像这样重新附加你的实体

_db.Products.Attach(product);

您的问题的另一个解决方案可能是将相同的上下文传递给AddItem方法,因为您已经添加了Products。这样,您就可以确保用于LineItems的上下文不会被分离,EF也不会看到需要再次添加Products(或任何其他实体)。

最诚挚的问候,

Adi江诗丹顿