Asp.net mvc ASP.NET MVC应用程序中Linq到Sql的DataContext设计问题和注意事项
在ASP.NETMVC应用程序中使用LINQtoSQL时,我使用“每个原子操作的单数据上下文”方法 到目前为止,我一直在使用单例datacontext,我知道它有很多问题,所以我重构了代码,在每个原子操作中使用单例datacontext 控制器操作的示例如下(重构并没有改变这一点):Asp.net mvc ASP.NET MVC应用程序中Linq到Sql的DataContext设计问题和注意事项,asp.net-mvc,linq-to-sql,architecture,datacontext,Asp.net Mvc,Linq To Sql,Architecture,Datacontext,在ASP.NETMVC应用程序中使用LINQtoSQL时,我使用“每个原子操作的单数据上下文”方法 到目前为止,我一直在使用单例datacontext,我知道它有很多问题,所以我重构了代码,在每个原子操作中使用单例datacontext 控制器操作的示例如下(重构并没有改变这一点): public ActionResult List() { List requests=this.repository.AllRequests(); 返回视图(请求); } 存储库的类型为IRepository。我
public ActionResult List()
{
List requests=this.repository.AllRequests();
返回视图(请求);
}
存储库的类型为IRepository。我希望保持这种抽象,以便能够切换到不同的数据层(根据我最近使用Linq到Sql的经验,这种情况很快就会发生:)
LinqRepository实现AllRequests()方法,如下所示:
public List<Request> AllRequests()
{
using (DataModelDataContext connection = GetContext())
{
return connection.Requests.ToList();
}
}
public List<Request> AllRequests()
{
DataModelDataContext connection = GetContext();
return connection.Requests.ToList();
}
public列出所有请求()
{
使用(DataModelDataContext连接=GetContext())
{
返回connection.Requests.ToList();
}
}
(仅供参考,以前DataContext实例是LinqRepository的一个字段,LinqRepository作为单个静态实例持有)
DataContext在方法返回之前被释放
视图代码现在在访问延迟属性时抛出ObjectDisposed异常:
<%= Html.Encode(request.Branch.Name) %> //throws
//抛出
我了解到可能不需要处理DataContext(此处)
当我不处理DataContext(删除using)时,就没有ObjectDisposedException
i、 e:我改变了方法如下:
public List<Request> AllRequests()
{
using (DataModelDataContext connection = GetContext())
{
return connection.Requests.ToList();
}
}
public List<Request> AllRequests()
{
DataModelDataContext connection = GetContext();
return connection.Requests.ToList();
}
public列出所有请求()
{
DataModelDataContext连接=GetContext();
返回connection.Requests.ToList();
}
但我想知道,在这个场景中不处理DataContext实例会有什么影响
我知道我应该在处理DataContext之前读取实体实例中的所有数据(包括延迟属性),但我不想引入另一个抽象(另一个请求类,将所有属性复制到它)
我的问题是:
实体对象是否持有对其父DataContext的强引用,从而防止对其进行GC调用?(我想是的,朱特想100%确定)
在需要保留数据层抽象的情况下,您能否就使用Linq to Sql的推荐方法提供建议?(包括部分属性更新)
是否有一个开源项目使用ASP.NET MVC中实现Linq到Sql的存储库抽象?我的解决方案是让存储库实现IDisposable。然后,我将在OnActionExecuting中的构造函数中的控制器中将存储库实例化为实例变量。然后,我将在OnResultExecuted中处理存储库。当您到达OnResultExecuted时,结果已经呈现,并且所需的任何数据都已消耗。存储库将类似地在其构造函数中实例化DataContext,并在释放时将其释放。我的解决方案是让存储库实现IDisposable。然后,我将在OnActionExecuting中的构造函数中的控制器中将存储库实例化为实例变量。然后,我将在OnResultExecuted中处理存储库。当您到达OnResultExecuted时,结果已经呈现,并且所需的任何数据都已消耗。存储库将类似地实例化它的构造函数中的DATACONTEX,并在处理它时处理它。
首先,让我们考虑一下发生了什么。
你是:- 打开数据上下文
- 获取一些数据
- 关闭数据上下文
- 正在尝试读取从数据上下文返回的数据