【发布时间】:2009-10-17 17:07:26
【问题描述】:
我在 ASP.NET MVC 应用程序中使用 Linq to Sql 时使用“每个原子操作的单个数据上下文”方法。
到目前为止,我一直在使用单例数据上下文,我了解到它存在很多问题,因此我重构了代码以在每个原子操作中使用单个数据上下文。
一个控制器动作的例子现在如下(重构没有改变这一点):
public ActionResult List()
{
List<Request> requests = this.repository.AllRequests();
return View(requests);
}
repository 的类型为 IRepository。我想保留这个抽象,以便能够切换到不同的数据层(根据我最近使用 Linq to Sql 的经验,这可能很快就会发生:))
LinqRepository 实现 AllRequests() 方法如下:
public List<Request> AllRequests()
{
using (DataModelDataContext connection = GetContext())
{
return connection.Requests.ToList();
}
}
(仅供参考,之前 DataContext 实例是 LinqRepository 的一个字段,而 LinqRepository 被保存为单个静态实例)
DataContext 在方法返回之前被释放。
视图代码现在在访问延迟属性时会抛出 ObjectDisposed 异常:
<%= Html.Encode(request.Branch.Name) %> //throws
我了解到可能不需要处理 DataContext(此处为 When should I dispose of a data context)
当我不处理DataContext(删除使用)时,没有ObjectDisposedException。
即:我将方法更改如下:
public List<Request> AllRequests()
{
DataModelDataContext connection = GetContext();
return connection.Requests.ToList();
}
但我想知道,在这种情况下不释放 DataContext 实例有什么影响?
我知道我应该在处理 DataContext 之前从实体实例中读取所有数据(包括延迟属性),但我不想引入另一个抽象(另一个 Request 类,将所有属性复制到它上面) .
我的问题:
实体对象是否持有对其父 DataContext 的强引用,从而阻止它被 GC-ed? (我想是的,只是想 100% 确定)
在需要保留数据层抽象时,您能否就使用 Linq to Sql 的推荐方法提供建议? (包括部分属性更新)
是否有使用在 ASP.NET MVC 中实现 Linq to Sql 的存储库抽象的开源项目?
【问题讨论】:
标签: asp.net-mvc linq-to-sql architecture datacontext