Entity Framework 并发

            using (CommonEntities entities = new CommonEntities())
            {
/*
MergeOption.NoTracking 选项
如果仅仅检索数据,并不需要更新数据,则可以通过使用MergeOption.NoTracking 取消变更跟踪。这样,就不会使用ObjectStateManager,减少执行查询的时间,所有返回的实体将是分离的状态(detached state)。在ASP.NET web application 或在WinForms / WPF Grids 控件中以只读方式显示数据时,NoTracking 是一个比较好的选择。
 
在使用对象服务(Object Services)和Entity SQL时,需要调用ObjectQuery 的一个重载构造函数,其中第三个参数是MergeOption 枚举。默认的行为是 AppendOnly,可以改变为 NoTracking。
*/
                entities.SystemRole.MergeOption = MergeOption.NoTracking;
 
                List<SystemRole> query = (from role in entities.SystemRole
                                       select role).ToList();
                return query;
            }
 
 
 
 
 
                try
                {
                    entities.SaveChanges();
                }
                catch (OptimisticConcurrencyException opt)
                {
/*
只有concurrency mode设置为Fixed的字段 才会判断是否有并发异常
 
并发异常的处理   RefreshMode.ClientWins方式将客户端值 覆盖数据库的值 
 
注意 e3.Entity 就是发生并发的object  不要多new新的object
*/
                    var failedEntities = from e3 in opt.StateEntries
                                         select e3.Entity;
                    entities.Refresh(RefreshMode.ClientWins, failedEntities.ToList());
                    entities.SaveChanges();
                }
posted @ 2008-12-09 13:25  gameoverboss  阅读(261)  评论(0编辑  收藏  举报