Ado.net EntityFramework的Update最简单方法

网上看到很多朋友在Update的时候都会用如下方法:

var sel=from t in _dataEntities.Employee where t.Id=newEntity.Id select sel;

if(sel.Count()==0)return;

Employee entity = sel.First();

entity.Name = newEntity.Name;

.......

简单的说就是将新对象的属性一个个复制,这样做当属性少的时候还可以,但属性多的时候就显的低效率,代码又长又恶心。所以自己总结出了UPDATE最简单的方法。

/// <summary>

/// 修改员工信息

/// </summary>

/// <param name="newEntity"></param>

/// <returns></returns>

[OperationContract]

public Employee UpdateEmployee(Employee newEntity)

{

_dataEntities.Employee.Attach(newEntity); // 附加对象

_dataEntities.ApplyCurrentValues<Employee>("Employee", newEntity); // 应用新对象

_dataEntities.ObjectStateManager.ChangeObjectState(newEntity, EntityState.Modified); // 修改对象状态,当EntityState为Modified时,SaveChanges才会执行变更,否则无效。

return CommitAllChanges<Employee>(newEntity);

}

以下是泛型方法,适用于增删改的数据保存,同时解决了并发冲突。

/// <summary>

/// 应用数据变更

/// </summary>

/// <typeparam name="T"></typeparam>

/// <returns></returns>

private T CommitAllChanges<T>(T entity)

{

try

{

// 解决并发冲突

if ((entity as EntityObject).EntityState!=EntityState.Added)

_dataEntities.Refresh(RefreshMode.ClientWins, entity);

_dataEntities.SaveChanges();

}

finally

{

if ((entity as EntityObject).EntityState != EntityState.Detached)

_dataEntities.Refresh(RefreshMode.StoreWins, entity);

}


return entity;

}