OnlyUpdateDifferentChanges我有一个Entity-Setemployee_table,我通过excel表获取数据,我已经加载到内存中,用户将点击保存将更改保存到数据库中,并插入第一次记录并继续下去,没有任何问题。但是如何只更新所做的更改呢?意思是,假设我有10行和5列,其中10列中的第7行被修改,而5列中的第3列被修改,我只需要更新那些发生变化的列的现有值并保留其他值.我可以检查if(myexistingItem.Name!=dbItem.Name){//update}但它非常乏味且效率低下,我相信有更好的方法来处理它。这是我到目前为止所得到的。varexcelData=SessionWrapper.GetSession_Model().DataModel.OrderBy(x=>x.LocalName).ToList();;vardbData=context.employee_master.OrderBy(x=>x.localname).ToList();employee_master=dbEntity=employee_master();if(dbData.Count>0){//updateforeach(vardbItemindbData){foreach(varxlDatainexcelData){if(dbItem.customer==xlData.Customer){dbEntity.customer=xlData.Customer;}//...检查其余道具....db.Entry(dbEntity).State=EntityState.Modified;db.employee_master.Add(dbEntity);}}//保存db.SaveChanges();}else{//insert}您可以使用反射使此检查更通用。使用此答案按属性名称获取值。publicstaticobjectGetPropValue(objectsrc,stringpropName){returnsrc.GetType().GetProperty(propName).GetValue(src,null);使用此答案按属性名称设置值。publicstaticvoidSetPropertyValue(objectobj,stringpropName,objectvalue){obj.GetType().GetProperty(propName).SetValue(obj,value,null);}这个答案列出了所有属性publicstaticvoidCopyIfDifferent(Objecttarget,Objectsource){foreach(varpropintarget.GetType().GetProperties()){vartargetValue=GetPropValue(target,prop.Name);varsourceValue=GetPropValue(source,prop.Name);如果(!targetValue.Equals(sourceValue)){SetPropertyValue(target,prop.Name,sourceValue);注意:如果需要排除某些属性,可以通过将属性列表传递给方法来实现,如果要排除,可以签入。更新:我正在更新这个答案,以提供更多关于为什么我现在建议反对基于手动反射的解决方案的背景信息;我还想澄清一下,一旦您确定这种解决方案符合要求,它本身并没有错。至于效率问题,只提到它们是因为问题提到了它们,我想指出代码中发布的效率低下,而不是手动输入40多个属性分配的效率低下,或者实际上只是专注于更新更改的字段问题。为什么不重写循环:foreach(varxlDatainexcelData){//在数据库数据中查找现有记录:varexisting=dbData.FirstOrDefault(d=>d.customer==xlData.Customer);if(existing!=null){//它已经存在于数据库中,更新它//参见下面的注释。}else{//它不存在,创建employee_master并将其插入上下文//或执行验证以查看是否可以完成插入等}//并提交:context.SaveChanges();这允许您避免初始if(dbData.Count>0)因为您将始终从excel表中插入任何在dbData中没有匹配条目的行,因此您不需要单独的代码块-时间插入。它也比当前循环更有效,因为现在您正在为xlData中的每个对象迭代dbData中的每个对象;这意味着如果您在每个项目中有1,000个项目,那么您将进行一百万次迭代......关于更新过程和效率的说明(注意:我知道问题不直接与效率有关,但因为你在上下文中提到了它复制属性,我只是想提供一些思考)更改所有共享内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
