4

Entity Framework 経由でデータを更新しようとすると、ASP.NET MVC3 に苦労しています。プロセスは次のとおりです。

私はこのモデルを持っています:

    public class Bet
    {
       public string BetID { get; set; }
       public int FixtureID { get; set; }
       public string Better { get; set; }
       public int GoalsHome { get; set; }
       public int GoalsGuest { get; set; }

       public virtual Fixture { get; set; }

    }

コントローラーでは、where ステートメントを使用してテーブルをフィルター処理し、ユーザーに一致するエントリのみを取得します。

    [HttpGet]
    public ActionResult Index()
    {
        var user = User.Identity.Name;
        var model = _db.Bets.Where(t => t.Better == user);

        return View(model);
    }

ビューは 2 つの部分で構成され、1 つはテーブル ヘッダーを処理し、もう 1 つはユーザーのすべてのベットを一覧表示します。

<fieldset>
    <legend>Bets</legend>
    <table>
        <tr>
            <th>
                Kickoff
            </th>
            <th>
                Home Team
            </th>
            <th>
                Guest Team
            </th>
            <th>
                Group
            </th>
            <th>
                Bet
            </th>
        </tr>
        @Html.EditorFor(m => m)  //this is resolved in an self made EditorTemplate
  </table>

EditorTemplate:

@model Betting.Models.Bet
<tr>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.Kickoff)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.HomeTeam)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.GuestTeam)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Fixture.Group)
</td>
<td>
    @Html.TextBoxFor(modelItem => Model.GoalsHome, new { style = "width: 30px" }):
    @Html.TextBoxFor(modelItem => Model.GoalsGuest, new { style = "width: 30px" })
</td>
    @Html.HiddenFor(modelItem => Model.FixtureID)
</tr>

コントローラーに戻り、モデルを更新しようとします。

    [HttpPost]
    public ActionResult Index(FormCollection collection)
    {
        var user = User.Identity.Name;
        var model = _db.Bets.Where(t => t.Better == user);
        TryUpdateModel(model);
        _db.SaveChanges();

        return RedirectToAction("Index");
    }

これはまったく何もしません。Entity Framework はデータベースをまったく更新しません。html ファイル内の結果の賭けタグが区別できるように、テーブルを分離しました (名前の値の前の [インデックス] に注意してください:

 <input data-val="true" data-val-number="The field GoalsHome must be a number." data-val-required="The GoalsHome field is required." name="[1].GoalsHome" style="width: 30px" type="text" value="3" />:
 <input data-val="true" data-val-number="The field GoalsGuest must be a number." data-val-required="The GoalsGuest field is required." name="[1].GoalsGuest" style="width: 30px" type="text" value="0" />

Entity Framework がデータベースを更新しない理由を誰か教えてもらえますか? オブジェクトのマッピングに何か問題がありますか?

4

2 に答える 2

1

以前も同じ問題を抱えていました。MSDNはこの件に関してかなり混乱する可能性がありますが、ページの途中で、proxycreation を有効にせずに POCO エンティティを作成する場合は、savechanges を呼び出す前に detectchanges を呼び出す必要があると述べています。

TryUpdateModel(model);
_db.DetectChanges();
_db.SaveChanges();
于 2012-05-19T02:02:35.633 に答える
0

OK、TryUpdateModelメソッドを使用せずにデータベースを更新する方法を見つけたようです。html投稿で送信されたアイテムは区別できるので、ビューから取得した賭けを保持するパラメーターをコントローラーメソッドに追加できます。次に、データベースからの結果を繰り返し処理し、ビューからの賭けのフィールド値で変更されたフィールドを更新します。

    [HttpPost]
    public ActionResult Index(FormCollection collection, List<Bet> bets)
    {
        var user = User.Identity.Name;
        var model = _db.Bets.Where(t => t.Better== user);
        int i = 0;
        foreach (var bet in model)
        {
            Bet the_Bet= bets.Find(
                delegate(Bet _bet)
                {
                    return _bet.BetID == bet.BetID;
                });
            bet.GoalsHome= the_Bet.GoalsHome;
            bet.GoalsGuest= the_Bet.GoalsGuest;
            i++;
        }
        _db.SaveChanges();

        return RedirectToAction("Index");
    }

TryUpdateModelメソッドで動作させる方法はまだあるのでしょうか。

于 2012-05-19T10:44:33.283 に答える