Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架不填充集合属性_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架不填充集合属性

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

我的问题与这些问题中提到的问题非常相似:

在我的例子中,情节的转折点是导航集合属性由EF填充,但只有在我查询了DbContext中依赖类型的DbSet属性之后。为了让我的情况更清楚,我的模型是如何建立的:

[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);