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)
您可以使用反射使此检查更通用.
使用此答案按属性名称获取值.
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以进行排除.
| 归档时间: |
|
| 查看次数: |
3902 次 |
| 最近记录: |