EF Code-First外键创建重复数据

时间:2011-10-20 21:27:30

标签: c# foreign-keys ef-code-first

我遇到Code-First ForeignKey的问题。我有一个如下所述的产品,我正在尝试使用现有产品创建一个新的LineItem。但是,当我将更改保存到我的上下文时,它会创建一个全新的产品,但是我最初使用的产品的副本除了id是新的(现在db中的新记录)。

这是我添加新订单项的地方:

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; }
}

为什么要创建新产品?

2 个答案:

答案 0 :(得分:1)

您的问题的另一个解决方案可能是将相同的上下文传递给AddItem方法,就像您添加Products时使用的方法一样。 通过这种方式,您可以确保用于LineItems的上下文不会被分离,并且EF不再需要再次添加Products(或任何其他实体)。< / p>

致以最诚挚的问候,

Adi Constantin

答案 1 :(得分:0)

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

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

_db.Products.Attach(product);