【问题标题】:What is the best method for updating all changed data in EF 4?更新 EF 4 中所有更改数据的最佳方法是什么?
【发布时间】:2010-06-04 14:00:07
【问题描述】:

我尝试创建一些方法,可以将任何已更改的数据从已更改的 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);
        }
    }
}

我不确定上述方法,因为它是更新数据的丑陋方法。从最近的错误中,我意识到如果您更新一些属性,如导航属性(来自其他表的相关数据),它将从数据库中删除当前记录。我不明白为什么会这样。但这对我来说很危险。

那么,您对这个问题有什么想法可以确保我从 ASP.NET MVC 更新数据吗?

谢谢,

【问题讨论】:

    标签: asp.net-mvc entity-framework-4


    【解决方案1】:

    您是否考虑过使用Automapper 之类的工具?您可以将实体类型映射到自身,并让自动映射器为您复制所有字段。实际上,我希望看到您在 MVC 中使用视图模型,而不是允许直接编辑您的实体,但这是个人喜好。

    【讨论】:

    • 我知道。有几个用于映射的开源库。但是,我认为这对我来说太复杂了。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多