簡體   English   中英

為什么包含在EF6中被忽略

[英]Why Includes are ignored in EF6

我有2個實體。

第一實體:

 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();
  1. 您沒有在調試時通過指向DbSet來檢查查詢。 要檢查實際發送到數據庫的查詢,必須使用Database.Log屬性 - Context Log屬性

我很確定你的查詢沒問題並且有第二個表的連接。

  1. 您將使用以下行在構造函數中刪除結果:

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

    EF生成一個從您的實體繼承的代理,覆蓋導航屬性並為其設置自己的集合。 您的構造函數在proxie之后調用,因為您的實體類是代理的基類。 只需刪除你的構造函數,它就可以了。

我更喜歡在我的實體中使用這種導航屬性初始化方式:

class WorkItem
{
    private ICollection<ItemUsage> _usage;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM