EntityFramework中的Bug ?. include和无参数构造函数

本文关键字:参数 构造函数 include 中的 Bug EntityFramework | 更新日期: 2023-09-27 18:05:42

背景:

使用数据库优先/只使用代码(虽然我认为这应该无关紧要)

基本设置如下:

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有问题?

也:提前道歉,这是对实际代码的解释,所以有些事情可能不完全相同…如果这是不可复制的,我将尝试复制我的类的更直接的版本。

EntityFramework中的Bug ?. include和无参数构造函数

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; }