我尝试创建一些方法,可以将任何已更改的数据从已更改的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更新数据吗?
谢谢,
答案 0 :(得分:0)
您是否考虑过使用像Automapper这样的工具?您可以将实体类型映射到自身,并让automapper为您复制所有字段。实际上我更希望看到你在MVC中使用视图模型而不是直接编辑你的实体,但这是个人偏好。