日期:2014-05-20  浏览次数:20976 次

关于EntityFrameWork在实际应用过程中并发处理的问题
1.User实体类
public class User
{
  [Key, Column("UserID", Order = 0, TypeName = "varchar"), StringLength(10), Required]
  public string UserID { get; set; }
  [ConcurrencyCheck, Column("UserName", Order = 1, TypeName = "varchar"), StringLength(50), Required]
  public string UserName { get; set; }
}
2.DbContext类
public class UserContext : DbContext
{
  public UserContext() : base("name=BlogDB") { }
  public IDbSet<User> Users { get; set; }
}
3.UserBLL类(为方便,我将数据访问和业务放在一起)
public class UserBLL
{
  public User GetUserById(string UserID)
  {
  using (db=new UserContext())
  {
  return db.Users.Find(UserID);
  }
  }
   
  public void UpdateUser(User user)
  {
  我们知道,EntityFramework本身的并发机制是完善的,但这是建立在同一个DBContext下
  //webform中通过GetUserById获取到User实例,对UserName进行了修改,
  //之后将修改之后的User通过该函数传递过来,但该user实例已经不是之前的实例了
  //此处可以理解成是一个全新的实例,那么若更新的话,如何保证并发?
  比如说:
  第一步:webform获取了UserID='01' UserName='sa'的User实例数据
  第二部:后来将UserName改成了"as"
  第三部:webform修改了UserName='sasa'
  第四步:本函数执行修改操作,并提示并发错误
  }
}

------解决方案--------------------
沉底啦
------解决方案--------------------
用乐观锁