Краткая справка:
Использование базы данных сначала / только код (хотя я не думаю, что это имеет значение)
Базовая настройка такова:
public class MyContext : DbContext
{
public DbSet<MyClass_MyClasses> MyClass_MyClasses { get; set; }
public DbSet<MyClass> MyClasses { get; set; }
}
public class MyClass_MyClasses
{
[Key]
[Column(Order = 0)]
public Guid ParentId { get; set; }
[Key]
[Column(Order = 1)]
public Guid MyClassId { get; set; }
public int Sequence { get; set; }
public virtual MyClass MyClass { get; set; }
}
public class MyClass
{
[Key]
public Guid Id { get; set; }
public string Url { get; set; }
// ...
}
// interface part isn't important, I'm just using the wrapper to
// combine data from different sources to eventually be passed to a Json service
public class EntityWrapper : ISomeInterface
{
public MyClass_MyClasses Relation { get; set; }
public string Url { get { return MyClass_MyClasses.MyClass.Url; } }
// ... some other stuff
public EntityWrapper() { }
}
Проблема, похоже, в том, что .Include (Func <,>) не соблюдается, когда я делаю что-то вроде этого:
using(MyContext context = new MyContext())
{
IEnumerable<EntityWrapper> wrappedResults =
from relation in context.MyClass_MyClasses.Include(mm => mm.MyClass)
orderby relation.Sequence ascending
select new EntityWrapper { Relation = relation };
foreach(EntityWrapper wrapper in wrappedResults)
{
// always thrown
if(wrapper.Relation.MyClass == null)
throw new WtfException("But I specified .Include?");
}
}
Я работал над этим, вместо того, чтобы выбрать EntityWrapper
, выбрать MyClass_MyClasses
и затем в моем foreach просто присвоить локальную переменную = new EntityWrapper { ... }
, которая работает.
Мой вопрос:
Я что-то делаю неправильно? или это ошибка с EF?
Также: заранее извиняюсь, это парафраз реального кода, поэтому некоторые вещи могут не совпадать ... Если это не воспроизводимо, я постараюсь скопировать более прямые версии моих классов.
Заранее спасибо.