0

私はEF4コードファーストでMVC3を使用しています。私はspecificEventId = 2specificEvent = X、新しいSpecificEventオブジェクトは、DB内に作成されてOrderオブジェクトを保存しようとすると、既にDBにおけるID 2を持つ特定のイベントXがありますにもかかわらず、MVC3 EF4は保存時に外部キーオブジェクトを複製します

public class Order { 

    public int ID { get; set; } 

    [Required] 
    public float Price { get; set; } 

    [Required] 
    public int PayMethodId { get; set; } 
    public PayMethod PayMethod { get; set; } 

    public int? SpecificEventId { get; set; } 
    public SpecificEvent SpecificEvent { get; set; } 

    public int? SeasonalTicketId { get; set; } 
    public SeasonalTicket SeasonalTicket { get; set; } 
} 

:私は、次のモデルを持っています。 specificEventId = 2specificEvent = nullを試してみると、データ検証エラーが発生します。

私は間違っていますか?私はSpecificEventSeasonalTicketをnullにしたいと思っています。そして、私は 'Order'を保存するたびにEF4がDBにこれらのオブジェクトの新しいインスタンスを作成しないようにしたいと思います。

更新

これは、DBにOrderを保存するための私のコードです:

public void SaveOrder(Order order) 
{ 
    Order fromDb = null; 

    // If editing an existing object. 
    if ((fromDb = GetOrder(order.ID)) != null) 
    { 
     db = new TicketsDbContext(); 
     db.Entry(order).State = System.Data.EntityState.Modified; 
     db.SaveChanges(); 
    } 
    // If adding a new object. 
    else 
    { 
     db.orders.Add(order); 
     db.SaveChanges(); 
    } 
} 

私は保存すると、私はelse句に到達行います。

+0

これはEFに関する最も一般的な質問ですので、質問をする前に何を探しましたか? –

+0

@ラディスラフ:私は "ef \ mvcオプションの外部キー"、 "ef \ mvcオブジェクトの重複保存"などを検索しました。私のケースに近いいくつかの例が見つかりましたが、それでも私のためには機能しませんでした。たぶん私は何かを忘れてしまった(私は小切手を出して自分自身を再確認した)か、あるいは間違ったことを探したかもしれない。私はこのバグを数時間デバッグしようとしました(私はEF noobのようなものです:)。あなたが何かを明らかにしていないと思ったり、私が探すことができる他のものについて何か提案があれば、私は聞いて嬉しいです。 – Ofirov

+0

あなたの質問にエンティティを保存するコードを追加する必要があります。 –

答えて

1

本当の質問は、どこからXのインスタンスを取得したのですか?あたかもEFがこの事例を知らないかのように見える。既に存在するSpecificEventをEFからフェッチし、それが返すプロキシを使用してナビゲーションプロパティを設定するか、EFにXを「添付」するよう指示して、意図が何であるかを知る必要があります。 EFが知っている限り、競合するIdを持つ新しいインスタンスを送信しようとしているので、エラーを適切に発行しているようです。

+0

EFを使用してDBから取得しましたが、オブジェクトをデバッグモードで表示すると、IDが正しい(Order内のIDとDB内のIDの両方に一致する)ようです。以前のリクエストでサーバから取得してセッションに保存しましたが、実際の保存は次のリクエストでのみ行いました。私の理解にはそれは問題ではない。 – Ofirov

+1

その場合、別のコンテキストからのもので、前の要求のものがおそらく長く消えています。それを新しい文脈に付ける必要があります。 –

+0

ありがとう!それはそれだった:) – Ofirov

関連する問題