【发布时间】:2020-08-20 05:25:27
【问题描述】:
给定以下三个类:
public class Make
{
public int MakeId { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
public ICollection<Model> Models { get; set; }
public Make()
{
Models = new Collection<Model>();
Name = string.Empty;
}
}
public class Model
{
public int ModelId { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
public Make Make { get; set; }
public int MakeId { get; set; }
Model()
{
Name = string.Empty;
Make = new Make();
}
}
public class VegaDbContext : DbContext
{
public VegaDbContext(DbContextOptions<VegaDbContext> options) : base(options)
{
}
public DbSet<Make> Makes { get; set; }
public DbSet<Model> Models { get; set; }
}
我想提供一个返回 Make 和相关模型的 API 端点。其功能如下所示:
[HttpGet("/api/makes")]
public async Task<IEnumerable<MakeResource>> GetMakes()
{
// Here Models is not being loaded!
var makes = await dbContext.Makes.Include(m => m.Models).ToListAsync();
// This is manually loading the required data, which works. But I don't want to do this.
foreach (var make in makes)
{
make.Models = await dbContext.Models.Where(m => m.MakeId == make.MakeId).ToListAsync();
}
// This mapper part is not of interest
return mapper.Map<IList<Make>, IList<MakeResource>>(makes);
}
这里的问题是,获取 Makes 的行不包括 Models,而是得到一个空列表。根据Microsoft's documentation,这是一个“完全定义的关系”,应该加载具有正确外键的模型。
似乎随着 EFC 3.0 的引入而发生了一些变化,而且似乎以前也有效。我不知道为什么会这样。如果有人有想法,我会很高兴!该数据库是使用代码优先迁移创建的。版本是:
.NET Core SDK (reflecting any global.json):
Version: 3.1.103
Commit: 6f74c4a1dd
Runtime Environment:
OS Name: manjaro
OS Version:
OS Platform: Linux
RID: arch-x64
Base Path: /usr/share/dotnet/sdk/3.1.103/
Host (useful for support):
Version: 3.1.3
Commit: ed88943d24
.NET Core SDKs installed:
3.1.103 [/usr/share/dotnet/sdk]
.NET Core runtimes installed:
Microsoft.AspNetCore.App 3.1.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
数据库中填满了:
【问题讨论】:
-
你在哪里为实体配置了PK-FK关系?就像在
OnModelCreating()回调中一样 -
当我使用默认约定时,EF 在创建迁移时会自动检测到这一点。如果它检测到创建迁移而不是查询,那会很奇怪,还是我在这里弄错了?
-
我还有两个关于
Model类的问题:1)为什么它的构造函数是私有的(错字?)为什么你有Make = new Make();行? -
这里是配置控制台记录器的链接stackoverflow.com/a/53693858/3579354
-
JFYI @Muqq,我能够重现内存提供者的问题,注释掉
Make = new Make()帮助 =)))
标签: c# .net-core entity-framework-core