【发布时间】: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