我正在开发一个现有的ASP.NET MVC应用程序,该应用程序从小规模开始,随着时间的推移需要重新构建和重构。重构实例化datacontext的LINQ TO SQL自定义属性
我正在努力的一件事是我们已经有了L2S实体的部分类,所以我们可以添加一些额外的属性,但是这些道具会创建一个新的数据上下文并查询数据库中的数据子集。这将是相当于做在SQL中,为oppsed到这是不是写这个查询一个非常好的方式以下连接:
SELECT tbl1.stuff,
(SELECT nestedValue FROM tbl2 WHERE tbl2.Foo = tbl1.Bar),
tbl1.moreStuff
FROM tbl1
因此,在短期这里就是我们在我们的一些局部实体已经有了类:
public partial class Ticket {
public StatusUpdate LastStatusUpdate
{
get
{
//this static method call returns a new DataContext but needs to be refactored
var ctx = OurDataContext.GetContext();
var su = Compiled_Query_GetLastUpdate(ctx, this.TicketId);
return su;
}
}
}
我们已经得到了创建编译的查询某些功能,但问题是,我们也有在DataContext定义了一些DataLoadOptions,因为我们实例化一个新的datacontext为获得这些嵌套的属性,我们获得例外
“编译查询跨越DataContexts 不同LoadOptions不 支持”
。第一个DataContext来自我们用重构实现的DataContextFactory,但是第二个DataContext只是挂起实体属性getter。
我们在重构过程中实现了Repository模式,因此我们必须在之前停止执行上述操作。有谁知道解决这个问题的好方法吗?
编辑:我添加了我们在重构工作中创建的DataContextFactory的代码。请注意,在上面的代码,我们在LINQ的DataContext的类的getContext()的静态方法,它的新闻了一个DataContext,而不是使用下面的DataContextFactory:
public class DataContextFactory<T> : IDataContextFactory where T : System.Data.Linq.DataContext
{
public DataContextFactory()
{
_context = Activator.CreateInstance<T>();
}
public DataContextFactory(T context)
{
_context = context;
}
private System.Data.Linq.DataContext _context;
public System.Data.Linq.DataContext Context
{
get
{
return _context;
}
}
public void SaveAll()
{
Context.SubmitChanges();
}
public bool IsContextDirty
{
get
{
return Context != null && (Context.GetChangeSet().Deletes.Count > 0 ||
Context.GetChangeSet().Inserts.Count > 0 ||
Context.GetChangeSet().Updates.Count > 0);
}
}
}
顺便说一句,多一点信息,所以我不让人们回答错误的问题。我明白为什么我们要得到LoadOptions异常,并且我们通过在加载DataContext时立即为LoadOptions分配静态委托调用来解决此问题。 主要问题是我们实际上有2个独立的上下文,并且由于存储库模式的新实现,我们需要以某种方式使这些属性能够利用由存储库中的DataContextFactory创建的相同上下文。 – 2010-04-12 03:14:41
每次调用GetContext时,DataContextFactory是否实例化一个新的DataContext? – SteadyEddi 2010-04-12 13:08:22
@SteadyEddi - 我用DataContextFactory的代码编辑了我原来的帖子。所以要回答你的问题,GetContext()方法不在工厂中,而是在DataContext类中。它每次都会实例化一个新的上下文。但是,只要我们在Web请求的整个生命周期中挂起工厂实例(因为这是针对ASP.NET MVC应用程序的),工厂类将把上下文保存到专用字段中。 – 2010-04-13 17:13:29