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一文中提到的那样。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接