代码之家  ›  专栏  ›  技术社区  ›  Thiago Silva

重构实例化datacontext的linq-to-sql自定义属性

  •  1
  • Thiago Silva  · 技术社区  · 15 年前

    我正在开发一个现有的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
        {
             //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来获取这些嵌套属性,所以我们得到一个异常

    “跨数据上下文的编译查询 不同的装载选项 支持“

    . 第一个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);
            }
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Peter Willis    15 年前

    不要在调用方法时创建datacontext,而是将其存储在 HttpContext.Current.Items .

    这将实现与将其存储在私有字段中相同的效果,因为它对请求是唯一的。