我遇到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; }
}
为什么要创建新产品?
答案 0 :(得分:1)
您的问题的另一个解决方案可能是将相同的上下文传递给AddItem
方法,就像您添加Products
时使用的方法一样。
通过这种方式,您可以确保用于LineItems
的上下文不会被分离,并且EF不再需要再次添加Products
(或任何其他实体)。< / p>
致以最诚挚的问候,
Adi Constantin
答案 1 :(得分:0)
根据评论,您使用的是产品对象的未附加副本。因此EF在附加时将其视为一个新实例(通过LineItem.Product
setter中生成的代码并相应地插入它。
您可以像这样重新附加您的实体
_db.Products.Attach(product);