仅更新不同的更改

Nic*_*ahn 3 c# asp.net-mvc entity-framework

我有一个实体集employee_table,我通过excel表获取数据,我已经加载到内存中,用户将单击Save以保存数据库中的更改,并且它首次插入记录并且没有问题.

但是,我该如何仅更新所做的更改?意思是,假设我有10行和5列,10行中说第7行被修改,5列中的第3列被修改,我只需更新那些更改并保留其他值的现有值列.

我可以做检查,if (myexistingItem.Name != dbItem.Name) { //update }但它非常繁琐,效率不高,我确信有更好的方法来处理.

这是我到目前为止所得到的.

var excelData = SessionWrapper.GetSession_Model().DataModel.OrderBy(x => x.LocalName).ToList();;
var dbData = context.employee_master.OrderBy(x => x.localname).ToList();

employee_master = dbEntity = employee_master();

if (dbData.Count > 0)
{
   //update
   foreach (var dbItem in dbData)
   {
      foreach(var xlData in excelData)
      {
         if(dbItem.customer == xlData.Customer)
         {
            dbEntity.customer = xlData.Customer;
         }
         //...do check rest of the props....
         db.Entry(dbEntity).State = EntityState.Modified;
         db.employee_master.Add(dbEntity);
      }
   }

   //save
   db.SaveChanges();
}
else
{
  //insert
}
Run Code Online (Sandbox Code Playgroud)

adr*_*dar 5

您可以使用反射使此检查更通用.

使用此答案按属性名称获取值.

public static object GetPropValue(object src, string propName)
{
    return src.GetType().GetProperty(propName).GetValue(src, null);
}
Run Code Online (Sandbox Code Playgroud)

使用此答案按属性名称设置值.

public static void SetPropertyValue(object obj, string propName, object value)
{
    obj.GetType().GetProperty(propName).SetValue(obj, value, null);
}
Run Code Online (Sandbox Code Playgroud)

这个答案列出了所有属性

public static void CopyIfDifferent(Object target, Object source)
{
    foreach (var prop in target.GetType().GetProperties())
    {
        var targetValue = GetPropValue(target, prop.Name);
        var sourceValue = GetPropValue(source, prop.Name);
        if (!targetValue.Equals(sourceValue))
        {
            SetPropertyValue(target, prop.Name, sourceValue);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您需要排除某些属性,则可以通过将属性列表传递给方法来实现非常简单,并且可以签入if以进行排除.