LINQ to SQL公共基类
2008-09-04 10:02:00 来源:WEB开发网因此,最佳实践应该是为每个操作创建一个新的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一文中提到的那样。
赞助商链接