2011-10-20 11 views
0

コードファースト外来キーに問題があります。私は以下のようなProductを持っており、その既存のProductを使って新しいLineItemを作成しようとしています。しかし、私のコンテキストに変更を保存すると、まったく新しい製品が作成されますが、IDが新しいもの(dbの新しいレコード)以外は、もともと使用していたものの複製が作成されます。EFコードファースト外来キー重複データの作成

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

は、なぜそれが新しい製品を作成している:私は、新しいラインアイテムを追加しているのはここ

ですか?

+1

どこに渡している製品をロードするコードはありますか?私はこの製品のインスタンスがもはや文脈に付随しないことを期待しているので、新しい記録と見なされています。テストとして、新しいLineItemにProduct = nullのままにして、ProductIdを設定します。 –

+0

ああ、それは問題です。私は自分の製品コレクションをキャッシュし、キャッシュされたコレクションの製品を使用していました。あなたが答えを出すなら、あなたを答えとしてマークします。私のキャッシュされたバージョンの製品を使用する方法はありますか? – DennyFerra

答えて

0

コメントごとに、製品オブジェクトの添付されていないコピーを使用しています。だから、EFは、それがLineItem.Productセッターで生成されたコードを経由して(添付ます新しいインスタンスとしてこれを見て、それに応じて挿入します。

あなたがするので、

_db.Products.Attach(product); 
1

別の解決策のようなエンティティを再接続することができ、あなたのProductsを追加した場所で同じコンテキストをAddItemメソッドに渡すことができます。 このようにしてLineItemsに使用されたコンテキストは切り離されず、EFではもう一度Products(または他のエンティティ)をもう一度追加してください。

敬具、

アディ・コンスタンティン

関連する問題