2016-08-29 4 views
2

これは別の場所で尋ねられますが、私はまっすぐな解決策を見つけることができません。 私のApiはオブジェクトモデルを渡しています。サーバ側では、渡されないオブジェクトのすべての値はnullと見なされます(意味があります)。 EF6に、渡されたオブジェクトからNull値を持つエンティティを更新しないように指示する方法はありますか?各プロパティを書き込む必要はありません。UoWアップデートを使用したEFリポジトリ

擬似コード

API

Update(int id, TaskEntity obj) 
{ 
    unitOfWork.Tasks.Update(id, userTask); 
    ... 
    unitOfWork.Save() 
} 

レポ更新

Update(int id, T entity) 
     { 
      var existingRecord = Get(id); //Gets entity from db based on passed id 
      if (existingRecord != null) 
      { 
       var attachedEntry = Context.Entry(existingRecord); 
       attachedEntry.CurrentValues.SetValues(entity); 
      } 
     } 

私の問題は、null値を持つすべてのデータが実際にNULL値を持つ既存のDBレコードの値を書き換えるということです。

これが解決された解決策または記事を教えてください。私は反射に向かうべきかどうか、automapperがこれを処理できるかどうか(私が信じる目的ではない)、あるいは何らかのヘルパーメソッドが書かれていなければならない。

ありがとうございます。

+0

この更新方法で更新するTaskEntityのプロパティのリストがありますか?または、null以外のすべてのプロパティーを更新する場合しかし、あなたが提供していない値と、nullに更新/更新したい値を区別する方法はありますか? – Developer

+0

私はあなたの質問を正しく理解していれば、関連するすべての情報をメソッドに渡し、エンティティの更新をすべて行うことができます。 – Eldho

+0

あなたが反射を使用したい場合は、これを行うことができますhttp://stackoverflow.com/questions/17385472/entity-framework-only-update-values-that-are-not-null。しかし、個人的に私は最高のことを感じていません – Eldho

答えて

5

あなたはこの

Update(int id, T entity,string[] excludedFields) 
{ 
    var existingRecord = Get(id); //Gets entity from db based on passed id 
    if (existingRecord != null) 
    { 
      var attachedEntry = Context.Entry(existingRecord); 
      attachedEntry.CurrentValues.SetValues(entity); 
      for(var field in excludedFields) 
      { 
       attachedEntry.Property(field).IsModified = false; 
      } 
    } 
} 

一部scenariesは、オブジェクト、時には他の部品の一部を更新する必要がありますように、私の意見では最良の方法は、更新

から除外するフィールドを通過させることである何かを行うことができます

あなたのお役に立てれば幸いです

+0

私はいくつかの種類のソリューションを見たことがあります。私はおそらく、nullで渡されるべきであると判断されるブール値で終わるでしょう。 – Raimonds

1

更新を行う前に、データベースを叩いて取得操作を行うのは、個人的に大きなファンではありません。 Ajaxの呼び出し中に、更新する必要があるプロパティのリストを送信することができます(null値への更新(既存のものの消去)も処理されるように)。 .IsModifiedは、関連のために動作しませんattachedEntry.Property(フィールド) -

Update(T entity,string[] includedFields) 
{ 
    var existingRecord = Context.Attach(entity); // assuming primary key (id) will be there in this entity 
    var attachedEntry = Context.Entry(existingRecord); 

    for(var field in includedFields) 
    { 
     attachedEntry.Property(field).IsModified = true; 
    } 

} 

注:私は(エンティティを取得するためのデータベースを押すことなく)@Hadiハッサンが何をしたかに小さな変更をやっている

エンティティ

関連する問題