我正在开发一个现有的asp.net mvc应用程序,它的起点很小,并且随着时间的推移而增长,需要良好的重新架构和重构。
我正在努力的一件事是,我们已经得到了l2s实体的部分类,因此我们可以添加一些额外的属性,但是这些属性创建了一个新的数据上下文,并向db查询数据子集。这相当于在sql中执行以下操作,这并不是像opsed to joins那样编写此查询的好方法:
SELECT tbl1.stuff,
(SELECT nestedValue FROM tbl2 WHERE tbl2.Foo = tbl1.Bar),
tbl1.moreStuff
FROM tbl1
简而言之,我们在一些部分实体类中得到了如下结果:
public partial class Ticket {
public StatusUpdate LastStatusUpdate
{
get
{
var ctx = OurDataContext.GetContext();
var su = Compiled_Query_GetLastUpdate(ctx, this.TicketId);
return su;
}
}
}
我们有一些创建编译查询的函数,但问题是我们也有一些在datacontext中定义的dataloadoptions,因为我们实例化了一个新的datacontext来获取这些嵌套属性,所以我们得到一个异常
“跨数据上下文的编译查询
不同的装载选项
支持“
. 第一个datacontext来自我们通过重构实现的datacontextfactory,但第二个datacontext只是挂起了实体属性getter。
我们在重构过程中实现了存储库模式,所以
必须
别再做这种事了。有人知道解决这个问题的好方法吗?
编辑:我正在为重构过程中创建的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);
}
}
}