4

ベストプラクティスをたくさん読んだ後、私は現在、すべてのビュー用にカスタマイズされたビューモデルを使用しており、コントローラーメソッドはビューモデルをビューに渡し、データベースを更新しています。

LINQ プロジェクションを使用して GET メソッドが正しく機能していますが、POST メソッドで何をすべきかわかりません。ビューモデルにそのビューが更新するプロパティのみが含まれているが、その特定のキーのエントリがデータベースに既に存在する場合、毎回 EF モデルのすべてのプロパティを取得せずにビューモデル プロパティを使用して EF モデルを更新するにはどうすればよいですか?

これが私のコードです:

ビューモデル

public class GeneralViewModel
{
    public string Title { get; set; }
    public decimal? Proposal_Type_ID { get; set; }
    public string User_Facility_ID { get; set; }
    public IEnumerable<SelectListItem> ProposalTypes { get; set; }
}

コントローラ

    public ActionResult General(int id)
    {
        var context = new PASSEntities();

        var model = (from a in context.Proposals
                     where a.ID == id
                     select new GeneralViewModel()
                     {
                         User_Facility_ID = a.User_Facility_ID,
                         Title = a.Title,
                         Proposal_Type_ID = a.Proposal_Type_ID
                     }).SingleOrDefault();

        var proposalTypes = context.Proposal_Types.Where(m => m.User_Facility_ID == model.User_Facility_ID).ToList();
        model.ProposalTypes = proposalTypes.Select(m => new SelectListItem { Value = m.ID.ToString(), Text = m.Description }).ToList();

        return PartialView(model);
    }


    [HttpPost]
    public ActionResult General(int id, GeneralViewModel model)
    {
        try
        {
            var context = new PASSEntities();
            var proposal = context.Proposals.Find(id);

            proposal.Title = model.Title;
            proposal.Proposal_Type_ID = model.Proposal_Type_ID;

            context.Entry(proposal).State = System.Data.EntityState.Modified;
            context.SaveChanges();

            return PartialView();
        }
        catch
        {
            return View();
        }

    }

私の Post メソッドは機能していますが、これが最善の方法だとは思いません。このようにした理由は、EF Proposal モデルを新しく作成し、そのプロパティをビューモデルのプロパティにマップしたときに、フォームで使用しなかったため、User_Facility_ID の値が null に変更されたためです。

だから本当に私はPOSTを実行するための最良の方法を探しています.

4

1 に答える 1

2

あなたがしているのは「正しい」方法です。コンテキストからエンティティを取得し、更新を行ってから変更を保存する必要があります。

AutoMapper などのマッピング ツールを使用している場合は、更新したくないキー フィールドをマップから除外していることを確認してください。

于 2013-09-12T18:28:45.457 に答える