2011-07-04 6 views
1

このコードは、モデルを最初に使用したときにうまく機能しました。そして、もしそれがnew Vote()ならば、投票の保存を止めました。私は、最初に生成されたモデルのクラスがプロパティセッターでいくつかの '魔法'を使用していたと思います。それはvirtualをコードの最初のプロパティに入れたものだと思いました。それは古いスタイルで動作させる方法はありますか?または、検索して置き換えて、別の方法でグラフに新しいオブジェクトを結び付ける必要がありますか?そのコードでどこモデルファーストからコードへの移行まず、いくつかの変更の変更

public ActionResult Vote(int id, string votetype) 
{ 
    int userid = ViewBag.User.Id; 
    var pub = DB.Publications.Single(p => p.Id == id); 
    var votes = pub.Votes.SingleOrDefault(v => v.MemberId == userid) ?? 
       new Vote 
       { 
        MemberId = userid, 
        Publication = pub 
       }; 
    DB.SaveChanges(); 
    return RedirectToAction("Full", new { id = id }); 
} 
+1

このコードは何をすべきですか?特に 'SaveChanges'はなぜですか?あなたはDBからエンティティを照会するだけですが、何も変更したり、新しいエンティティをコンテキストに追加することはありません。 – Slauma

答えて

4

それは前に働いたが、それはそれは実際にいくつかの内部の魔法を使用しているため、最初から悪い方法で書かれており、それができるあなたの例でました副作用と呼ばれる。あなたは、副作用を介していくつかのロジックを行うコードを避ける必要があります。

魔法はナビゲーションプロパティの自動修正です。新しいVoteを作成し、コンテキストにPublicationインスタンスを添付して、そのPublicationナビゲーションプロパティを設定します。そのような場合、EFはあなたのための関係を修正し、内部的にはVotePublicationに追加します。修正のため、新しいVoteも同様に(新しいエンティティとして)追跡されます。コード内で使用

カスタムクラスは、最初に手動でそれを書くか、最初のモデルとデータベースで使用POCO T4テンプレートによって生成されたコードからそれらをコピーしない限り、メソッドを修正はありません。修正しないと、新しいVoteはコンテキストに追加されず、SaveChangesは変更を行いません。

@ Diegoのコードを使用してメソッドを修正してください。

+0

良い説明。私は、コード最初の前にEFを使用していなかったとフィックスアップ魔法知りませんでした。 –

+0

@Diego:POCOの場合は、それがコードテンプレートではあなたのために生成されますと、フィックスアップは反対のナビゲーションプロパティに遅延読み込みをトリガすることができますので、それは遅延読み込みと組み合わせる場合は特に、非常に多くの問題を引き起こします。 –

3

新しい投票を永続化するためにEFを語っています。

変更するには、/への投票を作成します行:

var vote = pub.Votes.SingleOrDefault(v => v.MemberId == userid); 
if (vote == null) 
    pub.Votes.Add(new Vote 
        { 
         MemberId = userid, 
         Publication = pub 
        }); 
関連する問題