次のコードのように、変更された Data オブジェクト (このオブジェクトは ASP.NET MVC によって生成されます) から古い Data オブジェクト (このオブジェクトは DBMS の現在のデータから取得されます) に変更されたデータを更新できるメソッドを作成しようとしました。
public static bool UpdateSomeData(SomeEntities context, SomeModelType changedData)
{
var oldData = GetSomeModelTypeById(context, changedData.ID);
UpdateModel(oldData, changedData);
return context.SaveChanges() > 0;
}
次のソースコードのように、他の変更されていないデータに影響を与えずに、変更されたデータを保存する方法を作成しようとしています。
public static void UpdateModel<TModel>(TModel oldData, TModel changedData)
{
foreach (var pi in typeof(TModel).GetProperties()
.Where
(
// Ignore Change ID property for security reason
x => x.Name.ToUpper() != "ID" &&
x.CanRead &&
x.CanWrite &&
(
// It must be primitive type or Guid
x.PropertyType.FullName.StartsWith("System") &&
!x.PropertyType.FullName.StartsWith("System.Collection") &&
!x.PropertyType.FullName.StartsWith("System.Data.Entity.DynamicProxies")
)
)
{
var oldValue = pi.GetValue(oldData, null);
var newValue = pi.GetValue(changedData, null);
if (!oldValue.Equals(newValue))
{
pi.SetValue(oldData, newValue, null);
}
}
}
上記の方法は、データを更新するための非常に醜い方法であるため、よくわかりません。最近のバグから、Navigation Properties (他のテーブルの関連データ) などのプロパティを更新すると、現在のレコードがデータベースから削除されることがわかりました。なぜそれが起こったのか分かりません。しかし、それは私にとって非常に危険です。
では、ASP.NET MVC からのデータの更新について私に保証するために、この質問について何か考えはありますか?
ありがとう、