WEB开发网
开发学院数据库MSSQL Server LINQ to SQL公共基类 阅读

LINQ to SQL公共基类

 2008-09-04 10:02:00 来源:WEB开发网   
核心提示: 因此,最佳实践应该是为每个操作创建一个新的DataContext实例,LINQ to SQL公共基类(8),不用担心性能的问题,DataContext属于轻量级的资源,例如:public class EmployeeAccessor:AccessorBase<Employee,Nor

因此,最佳实践应该是为每个操作创建一个新的DataContext实例。不用担心性能的问题,DataContext属于轻量级的资源。

再来看看并发的问题。默认的选项是乐观并发(Optimistic Concurrency)。一旦保存了值, DataContext会检查之前的值是否更改。如果发生冲突,DataContext需要知道是否:自动重写之前的修改,或者保存之前的修改,或者以某种方式合并修改。

关于并发的问题并非本文讨论的问题。我们无法确定哪一种方法最好,或者最差,这需要视业务逻辑而定。通常,我会以last submit win的策略处理并发。因此,我封装了SubmitChanges方法,并将其定义为虚方法。若有必要,子类可以重写该方法:

  public class AccessorBase<TEntity, TContext>
  where TEntity : class, new()
  where TContext : DataContext, new()
  {
  private TContext m_context = null;
  protected virtual bool SubmitChanges(TContext context)
  {
  try
  {
  context.SubmitChanges(ConflictMode.ContinueOnConflict);
  return true;
  }
  catch (ChangeConflictException)
  {
  context.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);
  context.SubmitChanges();
  return true;
  }
  catch (Exception ex)
  {
  LogService.Error("Submit Changes error.", ex);
  return false;
  }
  finally
  {
  context.Dispose();
  }
  }
  public bool Update(TEntity originalEntity, Action<TEntity> update, bool hasRelationship)
  {
  InitDataContext();
  try
  {
  if (hasRelationship)
  {
  //Remove the relationship between the entitis
  Detach(originalEntity);
  }
  m_context.GetTable<TEntity>().Attach(originalEntity);
  update(originalEntity);
  SubmitChanges(m_context);
  }
  catch (InvalidCastException ex)
  {
  LogService.Error("Update Entity error.", ex);
  return false;
  }
  catch (NotSupportedException ex)
  {
  LogService.Error("Update Entity error.", ex);
  return false;
  }
  catch (Exception ex)
  {
  LogService.Error("Update Entity error.", ex);
  return false;
  }  
  }
  }

现在,我们拥有了一个通用的公共类,实体对象的访问类可以继承它。例如:

  public class EmployeeAccessor:AccessorBase<Employee,NorthwindDataContext>
  {
  }

你不需要实现任何方法,就能够很方便地对实体对象进行操作:

  [TestMethod()]
  public void UpdateEmployee()
  {
  EmployeeAccessor accessor = new EmployeeAccessor();
  IList<Employee> entities = accessor.Where(e => e.EmployeeID == 1);
  if (entities != null && entities.Count > 0)
  {
  entities[0].FirstName = "Bruce";
  entities[0].LastName = "Zhang";
  accessor.Update(entities[0],true,true);
  }
  }

你甚至可以直接让Employee实体类继承基类:

  public partial class Employee:AccessorBase<Employee,NorthwindDataContext>
  {
  }

这种方法类似于充血模式,正如Martin Fowler在Anemic Domain Model一文中提到的那样。

上一页  3 4 5 6 7 8 

Tags:LINQ to SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接