我有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();
最佳答案 >在调试时,您不是通过指向DbSet来检查查询.要检查实际发送到数据库的查询,必须使用Database.Log属性 –
Context Log property
我很确定你的查询没问题并且有第二个表的连接.
>您将使用以下行在构造函数中删除结果:
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>()); }
}
}