【问题标题】:C# Entity Framework Core .Include() issueC# Entity Framework Core .Include() 问题
【发布时间】:2020-07-03 11:11:11
【问题描述】:

我遇到了实体框架的“Include()”函数问题

使用的框架:.NET Core 3.1 和 Entity Framework Core 3.1.5

这些是我的实体

public class EntityA
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    
    [Required]
    [Index(IsUnique = true)]
    public int EntityBId { get; set; }

    [ForeignKey("EntityBId")]
    public EntityB EntityB { get; set; }

    [DefaultValue(false)]
    public bool IsConfirmed { get; set; }
}

public class EntityB
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Title { get; set; }
    
    public string Description { get; set; }
}

所以我启动了这个查询:

public ICollection<EntityA> GetAll(string contextName)
{
    DbContext context = GetContext(contextName);

    ICollection<EntityA> collection = context.EntityAs
        .Include(j => j.EntityB)
        .Where(x => x.IsConfirmed)
        .ToList();

    return collection;
}

private DbContext GetContext(string contextName)
{
    string contextDbConnectionString = _secretsRepository.GetDbConnectionString(contextName);

    DbContextOptionsBuilder<DbContext> optionsBuilder = new DbContextOptionsBuilder<DbContext>();
    optionsBuilder.UseSqlServer(contextDbConnectionString);

    return new DbContext(optionsBuilder.Options);
}

查询结果如下:

{
    Id: 5
    IsConfirmed: true
    EntityB: null
    EntityBId: 72
}

我不明白为什么“Include(j => j.EntityB)”没有返回正确赋值的 EntityB 字段

【问题讨论】:

  • 尝试将EntityB标记为virtual,所以public virtual EntitiyB EntityB {get; set}
  • 请检查生成的 SQL 以开始。是否包含EntityB?
  • @MindSwipe 我按照你说的尝试过,但没有任何改变
  • @TomTom 我已经看过了,但是生成的查询的结果是这样的:SELECT [p].[Id], [p].[IsConfirmed], [p].[EntityBId] FROM [EntityAs] AS [p] HERE [p].[IsConfirmed] = CAST(1 AS bit)
  • 好的,所以 EfCore 没有生成 SQL。您的 DbContext 没有正确注册元数据,因此永远不会解析关系。查看如何正确配置 DbContext。

标签: c# entity-framework-core-3.1


【解决方案1】:

当我尝试使用所提供的实体构建数据模型时,在 Index 属性处遇到编译错误。

[Required]
[Index(IsUnique = true)]
public int EntityBId { get; set; }

原来实体框架6个库曾经具有该属性,但问题是关于实体框架核心。所以我只是删除了 Index 属性并将其移至 OnModelCreating 方法以模仿类似的行为。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EntityA>().HasIndex(u => u.EntityBId).IsUnique();
}

有了这些,我应用代码优先的方法来生成数据库并运行程序。执行后,ef core 生成了正确的查询:

SELECT [e].[Id], [e].[EntityBId], [e].[IsConfirmed], [e0].[Id], [e0].[Description], 
[e0].[Title]
FROM [EntityAs] AS [e]
INNER JOIN [EntityBs] AS [e0] ON [e].[EntityBId] = [e0].[Id]
WHERE [e].[IsConfirmed] = CAST(1 AS bit)

希望它有助于解决您的问题。

【讨论】:

  • 谢谢,这解决了我的问题,我的问题是由于实体框架6库和实体框架核心库
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多