1

私は少し混乱しています。以下が機能する理由がわかりません。

    AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection formValues) {
       Dinner dinner = dinnerRepository.GetDinner(id);
       UpdateModel(dinner);
       dinnerRepository.Save();
       return RedirectToAction("Details", new { id = dinner.DinnerID });
    }

このサンプルは、Scott Guthrie の NerdDinner ウォークスルーから取得したもので、dinnerRepository.Save() は次のように定義されています。

public void Save() {
   db.SubmitChanges();
}

また、 dinnerRepository.GetDinner(id) は次のように定義されています。

public Dinner GetDinner(int id) {
   return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}

つまり、db NerdDinnerDataContext はどのようにしてディナー オブジェクトを保存することを「認識する」のでしょうか?

私のLinq To SQLの理解には穴があるに違いありませんが、それを特定できれば吹き飛ばされます。さて、dinner オブジェクトには ID がありますが、その ID を持つ特定のレコードに送信する変更があることを db に伝えるにはどうすればよいでしょうか?

私はそれを見ることができません。ワールドカップに違いない…

DataContext オブジェクトの db が、GetDinner メソッド呼び出しを使用して取得したディナー オブジェクトへの参照を保持しているとしか思えません。しかし...すべてが少し「魔法」のように感じます

アンドリュー

4

2 に答える 2

0

ご想像のとおり、ORM レイヤー (Linq2SQL またはエンティティ フレームワークのいずれか) によって処理されます。どちらを思い出さないでください)。ORM レイヤーが管理しているオブジェクトへの変更を追跡することは珍しくありません。また、変更されたオブジェクトが ORM レイヤーから取得されたため (db.Dinners.SingleOrDefault()呼び出しを介して、ORM はそのオブジェクトへの変更を追跡しているため、変更があったことを認識しています)。を呼び出すと変更されますSubmitChanges。これはすべて ORM の魔法の一部です。

于 2010-06-20T17:42:13.227 に答える
0

LINQ to SQL クラス用に生成されたコードを確認する必要があります。クラスのプロパティ セッターとゲッターには変更の追跡が含まれていることがわかります。これにより、次にリポジトリが保存されたときに、適切な SQL ステートメントが生成され、オブジェクトに加えられたすべてのミューテーションがコミットされます。

于 2010-06-20T17:42:18.483 に答える