2016-07-14 14 views
2

私は編集したいプロジェクトモデルを持っています。問題は、所有者への私の外部キーが編集後にnullに設定されていることです。MVC 6外部キーを持つモデルを編集する

また、ポストアクションintプロジェクトを作成するとき、私は所有者を手動で追加します。

私はそれを編集した後、私の外部キーがなぜリセットされたのかわかりません。私はそれを一人で残しておく方法を知らないのです。

これを行う正しい方法は何ですか?

public class Project 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public string OwnerId { get; set; } 

    [ForeignKey("OwnerId")] 
    public virtual ApplicationUser Owner { get; set; } 
} 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Edit(int id,  [Bind("Id,Description,Name")] Project project) 
    { 
     if (id != project.Id) 
     { 
      return NotFound(); 
     } 

     if (ModelState.IsValid) 
     { 
      try 
      { 
       _context.Update(project); 
       await _context.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!ProjectExists(project.Id)) 
        return NotFound(); 
       else 
        throw; 
      } 
      return RedirectToAction("Index"); 
     } 
     return View(project); 
    } 

答えて

3

問題は、あなたの[Bind]属性は、コントローラで使用Projectに戻っOwnerIdを結合しないためにModelBinderを伝えることです:

public async Task<IActionResult> Edit(int id,  [Bind("Id,Description,Name")] Project project) 

だからあなたOwnerIdあなたはProjectを保存するときにnullになります、 EFは前の所有者を削除します。

ビュー上のOwnerIdの非表示フィールドを使用して以前の所有者をラウンドトリップし、[Bind]属性に含めることができます。

さらに洗練された方法では、postdataにViewModelを使用し、コントローラ内のデータベースから既存のProjectをロードし、ViewModelからエンティティモデルに更新するプロパティのみをマップします。次に、明示的に上書きしたくないエンティティモデルのプロパティを上書きすることはできません。

+1

Bind属性に 'OwnerId'を追加し、ビューの' 'を追加しました。 – korn3l

+0

私はViewModelアプローチの使い方を知らなかった。あなたはそれの例を挙げることができますか? – korn3l

+0

この質問をご覧ください:http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc –

関連する問題