2017-02-23 9 views
0

これはAzureテーブルストレージに保存したレコードのタイプを表すクラスです。Azureテーブルストレージのレコードを更新するために同じタイプの2つのインスタンスをマージする方法

次に、HTTP POSTリクエストからデータを取り出し、データモデルとして使用されるUserModelオブジェクトにバインドするMVCアクションがあります。

[HttpPost] 
public void SetFullName(UserModel Model) 
{ 
    Model.SetFullName(); 
} 

は、私は全体のレコードを更新する必要がAzureテーブルストレージ内のレコードを更新するには、私はモデルから一度に新しいと更新され、古いデータを必要とするので、私は、単一のフィールドを更新することはできません。 この場合、Modelオブジェクトには、これらのプロパティ(値はEmail、ConfirmationCode、FirstNameおよびLastName)のみがあります。 base.Updateの前に呼び出すGet()メソッドは、Tableから値を取得し、値を持たないプロパティのModelオブジェクトに入れます。

テーブルFirstNameとLastNameにnullがありモデルに値がある場合、更新の動作とレコードは古い値と新しい値で正しく更新されます。しかし、他のケースでは、テーブルFirstNameとLastNameに値があり、モデルでnullの場合、Getメソッドはnull値ではなく、更新後のテーブルに古いFirst NameとLastNameをModelオブジェクトに入れます。いつも古い値です。

これを行う正しい方法は何ですか?私のアプローチは正しいのですか?

答えて

0

else if (InstanceProperty.GetValue(this) == null) InstanceProperty.SetValue(this, Property.GetValue(User));

このコードは、モデルプロパティの値がnullの場合、それはユーザー(talbeから入手)prpoertyの値を設定することを意味します。 FirstNameとLastNameがnullの場合、古いモデルのFirstNameとLastNameに置き換えられます。

古いモデルの名字を設定したくない場合は、プロパティ名を確認するためのif条件を記述することをお勧めします。 名前が "FirstName"または "Surname"の場合、SetValueメソッドは呼び出されません。

詳細については、次のコードを参照してください。サンプル: 注意:このコードでは、firstnameまたはlastnameプロパティを更新したいだけです。

public UserType Get() 
    { 
     TableQuery<UserType> Query = new TableQuery<UserType>().Where("PartitionKey eq '" + Email + "' and RowKey eq '" + ConfirmationCode + "'"); 
     UserType User = GetFromTable(Query).FirstOrDefault(); 

     Type InstanceType = GetType(); 
     foreach (PropertyInfo Property in typeof(UserType).GetProperties(BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) 
     { 
      PropertyInfo InstanceProperty = InstanceType.GetProperty(Property.Name, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
      if (Property.PropertyType.IsValueType && Equals(InstanceProperty.GetValue(this), Activator.CreateInstance(Property.PropertyType))) 
       InstanceProperty.SetValue(this, Property.GetValue(User)); 
      else if (InstanceProperty.GetValue(this) == null) { 
       if (InstanceProperty.Name != "FirstName" && InstanceProperty.Name != "Surname") 
       { 
        InstanceProperty.SetValue(this, Property.GetValue(User)); 
       } 
      } 
     } 
     return this; 
    } 

結果: テーブル enter image description here 新モデルから取得します。設定値の後

enter image description here

:あなたは全体のエンティティを更新したい場合は、ほかに enter image description here

、最初にローカルにエンティティを取得し、最後に新しいMVCモデルとエンティティを比較する必要がありますそれを更新する。

関連する問題