C# 实体框架不填充集合属性
我的问题与这些问题中提到的问题非常相似: 在我的例子中,情节的转折点是导航集合属性由EF填充,但只有在我查询了DbContext中依赖类型的DbSet属性之后。为了让我的情况更清楚,我的模型是如何建立的:C# 实体框架不填充集合属性,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我的问题与这些问题中提到的问题非常相似: 在我的例子中,情节的转折点是导航集合属性由EF填充,但只有在我查询了DbContext中依赖类型的DbSet属性之后。为了让我的情况更清楚,我的模型是如何建立的: [Table(nameof(Composer))] internal class ComposerRelationalDto : RelationdalDtoBase { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Iden
[Table(nameof(Composer))]
internal class ComposerRelationalDto : RelationdalDtoBase
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public virtual ICollection<NameRelationalDto> LocalizedNames { get; set; } = new HashSet<NameRelationalDto>();
public virtual ICollection<ArticleRelationalDto> Articles { get; set; } = new HashSet<ArticleRelationalDto>();
}
[Table(nameof(ComposerName))]
internal class NameRelationalDto : RelationdalDtoBase
{
[Key]
public long Id { get; set; }
[Required]
[ForeignKey(nameof(Composer))]
public Guid Composer_Id { get; set; }
public ComposerRelationalDto Composer { get; set; }
}
[Table(nameof(ComposerArticle))]
internal class ArticleRelationalDto : RelationdalDtoBase
{
[Key]
public long Id { get; set; }
[Index]
public Guid StorageId { get; set; }
[Required]
[ForeignKey(nameof(Composer))]
public Guid Composer_Id { get; set; }
public ComposerRelationalDto Composer { get; set; }
[Required]
[MaxLength(5)]
public string Language { get; set; }
}
Composer RelationalDTO集合中的Articles和LocalizedNames属性集合为空,即使数据已正确保留在数据库中。但是,如果在QuickWatch中加载ArticleRelationalDto和NameRelationalDto类型的所有DTO,则同一筛选器不再返回空集合,并且集合属性中存在所有相关对象
到目前为止,我所尝试的是
显式启用延迟加载和代理的创建
手动配置一对多关系:
modelBuilder.Entity<ComposerRelationalDto>().HasMany(c => c.LocalizedNames).WithRequired(n => n.Composer).HasForeignKey(n => n.Composer_Id);
modelBuilder.Entity<ComposerRelationalDto>().HasMany(c => c.Articles).WithRequired(a => a.Composer).HasForeignKey(a => a.Composer_Id);
最后,我尝试处理DbQuery.Include方法DbContext.Set.Includec=>c.Articles,不幸的是,它从它调用的一个内部方法抛出ArgumentNullException
基本上,我尝试过的任何修复或解决方法都没有帮助,所以我必须寻求更多的帮助
编辑:
我将依赖类型的Composer属性修改为虚拟。然而,问题依然存在
在使用.Selectgroup=>group.FirstOrDefault.Composer.Includec=>c.Articles.Includec=>c.LocalizedNames之后,我现在不再获得ArgumentNullException,可能是因为我最初使用的是.Include在QuickWatch?中,而是MySqlException:“字段列表”中的未知列“Join2.Id”;数据字典包含键:服务器错误代码值:1054。它也大得离谱,几乎看不清 我明白了。它是类声明的内部访问修饰符。遗憾的是,因为我真的想让解决方案的其余部分完全不受数据库的影响,因此首先不寻常地使用DTO来编写代码,而不是使用实际的实体,正如我在评论中已经指出的那样,我想严格执行这一点 无论如何,我还使用了一些访问修饰符,我只能通过使用内部受保护的构造函数公开它们来限制DB对象的可见性。涉及内部的类和ctor可见性的任何其他组合都会导致问题再次出现。我也不想和你在一起
这个问题——似乎表明使用内部类对EF来说不应该是个问题,但它毕竟是个问题。如果不是的话,朱莉·勒曼的答案可以追溯到2011年,现在是了。目前我正在使用EF 6.2.0。Hmm。。那真是一件棘手的事。我有一些猜测,但我不得不说.Include抛出异常的事实似乎是正在发生的事情中的一个重要线索。这根本不应该。考虑用错误中的任何相关信息更新你的问题,如果有的话。看看DbContext.Set.SelectManyc=>c.Articles.Load之类的东西会产生什么结果也会很有趣?使用exception/w a.Include语句可能会揭示有关映射的某些信息。一个细节是Composer属性也应该是虚拟的,以允许EF关联代理。还有,这是完整的映射吗?作曲家方面没有建模器?另一方面,后缀Dto对于一个实体来说是相当误导的。DTO意味着数据传输,这将是一个基本的POCO类,用于将信息从域中继到DbContext范围之外的外部使用者API客户端、视图等。@Classe在article DTO集中使用.Load会导致填充Articles属性,就像调用时一样。ToArray@StevePy我用更多的信息更新了这个问题。此外,modelBuilder中唯一与Composer DTO相关的映射已经包括在内。项目和名称没有任何其他Fluent API配置。实际上,我有一个独立于域模型的关系数据库模型;因此,Dto后缀在我的解决方案中是合适的。。。你怎么知道它们是空的?在启用延迟加载的情况下,EF不会对数据库执行任何查询,直到非常明确地告诉它。例如,如果您在其中一个集合上调用.ToList,是否有可能实际包含数据。ToList将对为您准备的查询调用一个操作,并要求它执行该操作并返回一个从数据库检索的响应。您可能仍然存在一些映射错误,并且分组似乎。。奇怪的但如果负载正常,则应超出范围
modelBuilder.Entity<ComposerRelationalDto>().HasMany(c => c.LocalizedNames).WithRequired(n => n.Composer).HasForeignKey(n => n.Composer_Id);
modelBuilder.Entity<ComposerRelationalDto>().HasMany(c => c.Articles).WithRequired(a => a.Composer).HasForeignKey(a => a.Composer_Id);