为什么EF6中忽略Includes

本文关键字:Includes EF6 为什么 | 更新日期: 2023-09-27 18:23:52

我有两个实体。

第一个实体:

 public WorkItem()
        {
            this.Usage = new Collection<ItemUsage>();
        }
        public int Id { get; set; }
        public string Description { get; set; }
        public virtual ICollection<ItemUsage> Usage { get; set; }

第二个实体:

  public class ItemUsage
    {
        public ItemUsage()
        {
        }
        public int Id { get; set; }
        public int WorkItemId { get; set; }
        public string UsedFor { get; set; }
        public virtual WorkItem WorkItem { get; set; }
    }

但是当我尝试获取所有工作项时,Usage列表是空的。即使我加了include。

 var all = EntitySet.Include(i => i.Usage).ToList();

延迟加载已禁用。你知道怎么了吗?

如果我在dbset中检查查询,则第二个表没有Join。

{SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Description] AS [Description]
    FROM [dbo].[WorkItem] AS [Extent1]
}

编辑:
配置:

    entity.HasKey(f => f.Id);
    entity.Property(f => f.UsedFor).IsRequired().HasMaxLength(1000);
    entity.HasRequired(f => f.WorkItem).WithMany(s => s.Usage).HasForeignKey(s => s.WorkItemId).WillCascadeOnDelete();

    entity.HasKey(f => f.Id);
    entity.Property(f => f.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    entity.Property(f => f.Description).IsRequired().HasMaxLength(1000);
    entity.HasMany(s => s.Usage).WithRequired(s => s.WorkItem).HasForeignKey(s => s.WorkItemId).WillCascadeOnDelete();

为什么EF6中忽略Includes

  1. 调试时,您不是通过指向DbSet来检查查询。要检查哪个查询实际发送到数据库,必须使用Database.Log属性-Context Log属性

我确信您的查询是可以的,并且与第二个表有连接。

  1. 您正在用以下行删除构造函数中的结果:

        this.Usage = new Collection<ItemUsage>();
    

    EF生成一个从实体继承的代理,覆盖导航属性并为其设置自己的集合。由于实体类是代理的基类,因此构造函数在proxy之后被调用。只要删除你的构造函数,它就会工作。

在我的实体中,我更喜欢这种风格的导航属性初始化:

class WorkItem
{
    private ICollection<ItemUsage> _usage;
    public virtual ICollection<ItemUsage> Usage
    {
        get { return _usage ?? (_usage = new Collection<ItemUsage>()); }
    }
}