Может ли кто-нибудь помочь мне оценить, почему код ниже не работает.Я использую общий метод расширения для реализации Include при использовании IObjectset.В наших репозиториях мы видели, что это не возвращалось правильно, поэтому я выделил код в тестовом приложении, как показано ниже.Я также включил контекст на основе интерфейса, если это может оказаться уместным, и снимок экрана с соответствующим разделом модели.Это происходит для всех включений в свойствах IObjectSet, а не только для DPASelections, которые я выбрал для этого примера.
Если я обновляю контекст, чтобы вернуть ObjectSet (все еще используя объекты POCO), а не IObjectSet, все работает нормально.При использовании IObjectSet и метода расширения и пошаговом выполнении кода я вижу, что метод расширения завершается правильно с вызовом ObjectQuery, к которому мы приводим данные, но включенные сущности никогда не возвращаются на графике.Как уже было сказано, это прекрасно работает, когда я не взаимодействую с Context и не возвращаю свойства ObjectSet, поэтому вызываю функцию Include непосредственно для ObjectSet.
Я не получаю никаких ошибок при выполнении запроса, так что это не то же самоеа также несколько других вопросов по SO, которые относятся к скомпилированным запросам.
Кто-нибудь еще испытывал проблемы с реализацией этого метода расширения или кто-нибудь может заметить, что я делаю здесь неправильно?
Любая помощь оченьоценил.
static void Main(string[] args)
{
using (var context = new AssocEntities())
{
context.ContextOptions.LazyLoadingEnabled = false;
Candidate candidate = context.Candidates
.Include("DPASelections.DPAOption")
.SingleOrDefault(c => c.Number == "N100064");
//Count is 0 when using ext. method and IObjectSet through AssocContext but correct when using Include
//on ObjectSet through AssocContext
Console.WriteLine("DPASelection count = {0}",candidate.DPASelections.Count);
//This is always null when using IObjectSet and ext. method but populated
//when using Include on ObjectSet
var option = candidate.DPASelections.First().DPAOption;
Console.WriteLine("First DPAOption = {0} : {1}",option.Id,option.Text);
}
Console.ReadLine();
}
}
public static class Extensions
{
public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path)
{
var objectQuery = source as ObjectQuery<TSource>;
if (objectQuery != null)
{
objectQuery.Include(path);
}
return source;
}
}
//Subset of custom context implementing IObjectSet as returns.
//Works fine when I return ObjectSet rather than IObjectSet and use
//the Include method directly
public partial class AssocEntities : ObjectContext
{
public const string ConnectionString = "name=AssocEntities";
public const string ContainerName = "AssocEntities";
#region Constructors
public AssocEntities()
: base(ConnectionString, ContainerName)
{
this.ContextOptions.LazyLoadingEnabled = true;
}
public AssocEntities(string connectionString)
: base(connectionString, ContainerName)
{
this.ContextOptions.LazyLoadingEnabled = true;
}
public AssocEntities(EntityConnection connection)
: base(connection, ContainerName)
{
this.ContextOptions.LazyLoadingEnabled = true;
}
#endregion
#region IObjectSet Properties
public IObjectSet<Address> Addresses
{
get { return _addresses ?? (_addresses = CreateObjectSet<Address>("Addresses")); }
}
private IObjectSet<Address> _addresses;
public IObjectSet<Answer> Answers
{
get { return _answers ?? (_answers = CreateObjectSet<Answer>("Answers")); }
}
private IObjectSet<Answer> _answers;
public IObjectSet<Candidate> Candidates
{
get { return _candidates ?? (_candidates = CreateObjectSet<Candidate>("Candidates")); }
}
}
И модель ...