рефакторинг пользовательских свойств LINQ TO SQL, создающих экземпляр datacontext - PullRequest
1 голос
/ 11 апреля 2010

Я работаю над существующим приложением ASP.NET MVC, которое началось с небольшого размера и со временем стало требовать хорошей реорганизации и рефакторинга.

Одна вещь, с которой я борюсь, это то, что у нас есть частичные классы сущностей L2S, чтобы мы могли добавить некоторые дополнительные свойства, но эти реквизиты создают новый контекст данных и запрашивают в БД подмножество данных. Это было бы эквивалентно выполнению следующих действий в SQL, что не очень хороший способ написать этот запрос в отличие от объединений:

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;
    }
}

}

У нас есть некоторые функции, которые создают скомпилированный запрос, но проблема в том, что у нас также есть некоторые DataLoadOptions, определенные в DataContext, и, поскольку мы создаем новый datacontext для получения этих вложенных свойств, мы получаем исключение

"Скомпилированные запросы через DataContexts с разными LoadOptions не поддерживается "

. Первый DataContext исходит из DataContextFactory, который мы реализовали с помощью рефакторингов, но этот второй просто зависает от метода получения свойства сущности.

Мы внедряем шаблон Repository в процесс рефакторинга, поэтому мы должны прекратить делать такие вещи, как указано выше. Кто-нибудь знает хороший способ решения этой проблемы?

РЕДАКТИРОВАТЬ: я добавляю код для DataContextFactory, который мы создали во время наших усилий по рефакторингу. Обратите внимание, что в приведенном выше коде у нас есть статический метод GetContext () в классе Linq 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 Ответ

0 голосов
/ 14 апреля 2010

Вместо создания DataContext при каждом вызове метода, сохраните его в HttpContext.Current.Items.

Это даст тот же эффект, что и сохранение его в приватном поле, так как оно будет уникальным для запроса.

...