2015-11-23 53 views
4

我有2個實體。爲什麼包含在EF6中被忽略

一是實體:

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

但是,當我試圖讓所有的工作項目使用的列表是空的。即使我添加包含。

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(); 
+0

是否所有的外鍵創建? –

+0

惰性加載如何禁用?訪問Usage屬性時會發生什麼? – user449689

+0

只有一個外鍵(WorkItemId),並且是創建的。 Usage屬性是空列表(即使數據庫中有數據)。我使用下一個代碼行禁用了延遲加載:Configuration.LazyLoadingEnabled = false;但即使設置爲true,它也是一樣的。 – Raskolnikov

回答

2
  1. 你不是指向DbSet在調試檢查查詢。要檢查哪些查詢實際發送到數據庫,你必須使用Database.Log屬性 - Context Log property

我敢肯定你的查詢是OK,並與第二表的連接。

  • 你這一行刪除在構造結果:

    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>()); } 
        } 
    } 
    
    +0

    不幸的是沒有。如果我只是刪除構造函數比用法爲空。來自我的日誌文件的查詢不加入。查詢是:SELECT [Extent1]。[Id] AS [Id], [Extent1]。[Description] AS [Description] FROM [dbo]。[WorkItem] AS [Extent1] – Raskolnikov

    +0

    然後您需要隔離問題通過創建重現它的最小示例,並在此處顯示代碼。再次,確保你在這裏發佈的sql來自日誌,而不是來自DbSet的ToString表示 – astef