Я использую VS2010 .Net4 Linq-EntityFramework и хотел бы явно загрузить некоторые дочерние данные. Я хотел бы предоставить функциональность, аналогичную DataLoadOptions или LoadWith , которые доступны для Linq-to-SQL IIUC, но недоступны для Linq-to-EF.
(Кроме того, это позволяет записывать данные для последующего воспроизведения во время тестирования. Мы использовали ленивую загрузку, и мне нужно найти эти вхождения и заменить их активной загрузкой. DataLoadOptions метод позволил бы реализовать чистый способ.)
Я пытаюсь предоставить безопасную для загрузки схему загрузки, как описано в Блог MosesOfEgypt . Я изменил поколение T4, и у меня, как мне кажется, последняя проблема. В .Net4 свойства сущности возвращают ObjectSet . Но, к сожалению, функция Include возвращает ObjectQuery , который является базовым классом для ObjectSet .
Вот подмножество класса ObjectContext, сгенерированное из модифицированного шаблона T4:
#region DataLoadOptions Functionality
public DataLoadOptions LoadOptions { get; set; }
private ObjectSet<TEntity> ApplyDataLoadOptions<TEntity>(string queryString) where TEntity : class
{
var query = CreateObjectSet<TEntity>(queryString);
if (LoadOptions != null)
{
var members = LoadOptions.GetPreloadedMembers<TEntity>();
foreach (var member in members)
{
********** query = query.Include(member.Name);
}
}
return query;
}
#endregion
#region ObjectSet Properties
/// <summary>
/// No Metadata Documentation available.
/// </summary>
public ObjectSet<Address> Addresses
{
get
{
if ((_Addresses == null))
{
_Addresses = ApplyDataLoadOptions<Address>("Addresses");
}
return _Addresses;
}
}
#endregion
Строка, начинающаяся с «*», - это место, где происходит приведение от ObjectQuery к ObjectSet . И это недопустимое преобразование, поэтому, если оно явно приведено во время разработки, произойдет сбой во время выполнения, если я не делаю это неправильно.
Одним из решений может быть написание метода расширения для ObjectSet.Include , чтобы он возвращал ObjectSet вместо ObjectQuery . Я хотел бы знать, как найти исходный код функции ObjectQuery.Include , если это возможно. И я не уверен, что эти решения будут работать.
Также интересно, был ли способ повысить результаты функции Включить с ObjectQuery до ObjectSet . Опять же, не уверен, что это сработает.
Буду признателен за любую помощь в реализации возможности DataLoadOptions для Linq-to-EF в .Net4.