1

次のコードのように、変更された 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 からのデータの更新について私に保証するために、この質問について何か考えはありますか?

ありがとう、

4

1 に答える 1

0

Automapperのようなツールの使用を検討しましたか?エンティティタイプをそれ自体にマップし、automapperにすべてのフィールドをコピーさせることができます。実際には、エンティティを直接編集できるようにするのではなく、MVCでビューモデルを使用することを望んでいますが、それは個人的な好みです。

于 2010-03-22T03:07:59.860 に答える