Внешний ключ EF Code-First Создание дублирующих данных - PullRequest
1 голос
/ 21 октября 2011

У меня проблемы с кодовым ключом ForeignKey. У меня есть продукт, как описано ниже, и я пытаюсь создать новый LineItem с этим существующим продуктом. Однако, когда я сохраняю изменения в моем контексте, он создает совершенно новый Продукт, но дублирует тот, который я использовал изначально, за исключением того, что идентификатор является новым (новая запись в БД теперь).

Вот где я добавляю новую позицию:

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 ]

1 голос
/ 22 декабря 2013

Другим решением вашей проблемы может быть передача того же контекста методу AddItem, который использовался для добавления Products. Таким образом, вы будете уверены, что контекст, используемый для LineItems, не будет отсоединен, и EF не увидит необходимости добавлять Products (или любую другую сущность в этом отношении) еще раз.

С уважением,

Ади Константин

0 голосов
/ 21 октября 2011

Согласно комментариям, вы используете неприкрепленную копию объекта вашего продукта.Таким образом, EF видит это как новый экземпляр, когда он присоединяется (через сгенерированный код в LineItem.Product и вставляет его соответствующим образом.

. Вы можете повторно присоединить свою сущность следующим образом

_db.Products.Attach(product);
...