背景:
使用数据库优先/只使用代码(虽然我认为这应该无关紧要)
基本设置如下:
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有问题?
也:提前道歉,这是对实际代码的解释,所以有些事情可能不完全相同…如果这是不可复制的,我将尝试复制我的类的更直接的版本。
Include
和投影是分离的=一旦使用投影,Include
不会自动使用。试试这个:
var results =
from relation in context.MyClass_MyClasses.Include(mm => mm.MyClass)
orderby relation.Sequence ascending
select relation;
foreach(EntityWrapper wrapper in results.ToList()
.Select(r => new EntityWrapper { Relation = r }))
{
// always thrown
if(wrapper.Relation.MyClass == null)
throw new WtfException("But I specified .Include?");
}
您也可以尝试使用AsEnumerable
代替ToList
尝试删除virtual
关键字
public virtual MyClass MyClass { get; set; }