首页 / 软件开发 / LINQ / 基于LINQ TO SQL的多层架构中,如何将实体附加至不同的DataContext
基于LINQ TO SQL的多层架构中,如何将实体附加至不同的DataContext2011-08-07 博客园 码农.ken注意:1.本文中所提到的“实体”均为由LINQ TO SQL生成的(即.dbml)2.你需要了解LINQ TO SQL对表关联的实现方式,EntitySet 和 EntityRef也许你看到标题后,会觉得问题比较抽象,那么我举个实例来具体说明一下问题。在基于LINQ TO SQL的N层架构中,假如我们需要对一个实体进行更新,那么流程应是这样:流程BLL.GetModel(p=>p.id==1) --> 修改相应属性(字段)值 --> BLL.Update(Entity entity) --> DAL.Update(Entity entity) --> 更新成功此时,我们需要将这个实体从业务层(BLL)传递到数据访问层(DAL),当GetModel方法返回实体后 会立即释放掉DataContext,然后到了执行DAL.Update(Entity entity)方法时又重新实例化一个 DataContext来进行更新操作;可见被传递的实体是从第一个DataContext传递到另一个 DataContext,在 LINQ TO SQL中这种跨越不同DataContext操作时,需要先进行附加操作,也就是 context.Entity.Attach(entity,true); 最后再context.SubmitChanges();还是看看代码吧:class BLL
{
private readonly DAL dal = new DAL();
public LinqToSqlProvider.User GetModel (Expression<Func<LinqToSqlProvider.User, bool>> expression)
{
dal.GetModel(expression);
}
public void Update(LinqToSqlProvider.User entity)
{
dal.Update(entity);
}
}
class DAL
{
public LinqToSqlProvider.User GetModel (Expression<Func<LinqToSqlProvider.User, bool>> expression)
{
LinqToSqlProvider.User entry = new CriTextBroadcast.LinqToSqlProvider.User();
using (CriTextBroadcastDBDataContext context = DataContext)
{
entry = context.User.SingleOrDefault(expression);
}
return entry;
}
public void Update(LinqToSqlProvider.User entity)
{
using (CriTextBroadcastDBDataContext context = DataContext)
{
context.User.Attach(entry, true);
context.SubmitChanges();
}
}
}