0

私はEFのアップデートと完全に混乱しています。インターネットで関連するチュートリアルを見つけようとしましたが、何も見つかりませんでした。

私は2つの質問を念頭に置いています。

  1. 一部のテーブルの特定のフィールドのみを更新する方法。
  2. 更新はナビゲーションプロパティでどのように機能しますか?(つまり、エンティティを更新すると、Ef(Linq to Entity)もそのナビゲーションプロパティを更新しますか?)

    [Table("master")]
    public class masterViewModel
    {
      [Key,ForeignKey("address")]
      public int id { get; set; }
      public string name { get; set; }
      public string lastName { get; set; }
      public virtual address address { get; set; }
    }
    
    public class address
    {
    [Key]
    public int id { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    

    } つまり、私が自分の見解で私が以下のようなことをした

    と仮定します[masterViewModel.id=1 , masterViewModel.name="ABC" and masterViewModel.lastName=null ] [address.id=1 , address.city="xyz" and address.state=null]

        @Html.DisplayFor(modelModel => Model.name)
        @Html.DisplayFor(modelModel => Model.address.city)
        @Html.HiddenFor(x => x.id)@Html.HiddenFor(x => x.address.id)
        @Html.EditorFor(modelModel => Model.address.state )
        @Html.EditorFor(modelModel => Model.lastName)
    



名前と文字列のプロパティにDisplayForを使用したため、フォームの投稿時にコントローラーアクションでこれら2つのフィールドの値を取得することはありません。したがって、「state」(アドレスの)プロパティと「lastName」(masterViewModelの)プロパティのみを更新するものが必要です。

4

2 に答える 2

2

1つの方法は、@ Kyleが提案したように、他のプロパティの非表示フィールドを使用することですが、その結果、不要なプロパティがクライアントからサーバーに転送されたり、戻ったりします。また、悪意のあるクライアントが変更された送信を送信するPOSTリクエストを作成する可能性があるため、追加の脆弱性が発生namecityます。また、サーバー側で追加の検証ロジックが必要になります。

すべてのプロパティを更新したくない場合は、EFに通知する必要があります。コントローラのアクションに変更されたデータを含む関連アドレスを持つmasterViewModelを受け取ったとします。今、あなたはこのようなことをすることができます:

using (var context = new YourDbContext())
{
    // This will inform EF about your existing masterViewModel and related address
    context.MasterViewModels.Attach(masterViewModel);
    // Now you must explicitly tell which properties you want to update
    var masterEntry = context.Entry(masterViewModel);
    masterEntry.Property(m => m.lastName).IsModified = true; 
    var addressEntry = context.Entry(masterViewModel.address);
    addressEntry.Property(a => a.state).IsModified = true;
    context.SaveChanges(); 
}

ところで。あなたの場合、アドレスは個別のエンティティではなく、マスターテーブルに格納されている複合型である可能性があります。

于 2012-04-25T06:56:42.823 に答える
0

ポストバックの値nameを取得していないだけですか?address.city

これを修正するには、これらのプロパティの非表示フィールドを追加します。

@Html.HiddenFor(modelModel => Model.name)
@Html.HiddenFor(modelModel => Model.address.city)

これで、フォームがサーバーにポストバックするときにこれらの値が含まれるようになります。

于 2012-04-25T06:49:18.237 に答える