c# - Entity Framework Core,一对多关系,集合总是空的
问题描述
我试图在 InMemory 数据库中建立一个简单的一对多关系,该数据库是由 http 请求在运行时建立的。我是 Entity Framework Core 的新手,所以我不确定这是否是使用它的正确方法。
值控制器.cs
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly DataListContext _Context;
public ValuesController(DataListContext context)
{
_Context = context;
}
[HttpGet]
public ActionResult<IEnumerable<DataList>> Get()
{
// Datas keeps is value
Console.WriteLine("Root Count: " + _Context.RootDatas.Count());
if (_Context.RootDataLists.Count() > 0)
{
// InsideDatas is always
Console.WriteLine("Inside Count: " + _Context.RootDataLists.First().InsideDatas.Count);empty next request
}
return _Context.RootDataLists.ToList();
}
[HttpPost]
public void Post([FromBody] string value)
{
var data = new Data() { Id = Guid.NewGuid() };
_Context.RootDatas.Add(data);
var dataList = new DataList();
dataList.Name = value;
dataList.InsideDatas.Add(data);
_Context.RootDataLists.Add(dataList);
_Context.SaveChanges();
// InsideDatas has an element
Console.WriteLine("Inside Count: " + _Context.RootDataLists.First().InsideDatas.Count);
}
}
public class DataListContext : DbContext
{
public DbSet<DataList> RootDataLists { get; set; }
public DbSet<Data> RootDatas { get; set; }
public DataListContext(DbContextOptions<DataListContext> options) : base(options) { }
}
public class Data
{
[Key] public Guid Id { get; set; }
}
public class DataList
{
public DataList()
{
InsideDatas = new List<Data>();
}
[Key]
public string Name { get; set; }
public ICollection<Data> InsideDatas { get; set; }
}
启动.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DataListContext>(options => options.UseInMemoryDatabase(databaseName: "DataList"));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
如果 InsideDatas 列表在下一次调用中始终为空,而不是 RootDatas,那么我的问题是。DataListContext 中的 DbSet RootDatas 并不是我在应用程序中真正需要的任何东西,但我认为它会使数据库保留 InsideDatas 元素。但不是。
所以我用这一切都错了吗?我的用例是一个服务器列表,通过主机发布它的存在到列表服务在运行时构建。我的计划是将 InMemoryDatabase 交换为 redis,以便在需要时能够适当地扩展它。(此代码只是具有相同问题的实际代码的精简版本)
解决方案
您需要告诉EF Core 加载相关实体。一种方法是通过急切加载:
// notice the Include statement
_Context.RootDataLists.Include(x => x.InsideDatas).First().InsideDatas
推荐阅读
- java - 如何使用 Jackson 创建不可变 DTO 但没有注释?
- javascript - 在 Ckeditor 中,如果我输入文本或退格输入复选框将取消选中并且值将更改
- c++ - Android NDK Crashanalytics 将日志发送到 Firebase 时出错。(C++)
- flutter - 如何在颤动中解决(操作系统错误:不允许操作,errno = 1)
- pandas - Databricks 火花雪花 dataframe.toPandas() 占用更多空间和时间
- python - Serializers.validated_data 字段随 DRF 中的源值而更改
- c++ - IIS 在回收期间是否取消/注册 C++ COM 库?
- linux - 如何使用 Gmail 为 Airflow 电子邮件警报设置 SMTP 服务器
- swiftui - iOS 15 上的 SwiftUI,自定义按钮样式不再起作用,它在 iOS 14 上运行良好,如何解决?
- java - 如何返回一个 Mono 空对象,以便它被 application/json 格式接受?