Я работаю над существующим приложением 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);
}
}
}