【发布时间】:2022-02-03 23:35:05
【问题描述】:
我正在尝试编写一个小型 Web api,这是我第一次使用实体框架。
我的问题是只保存了我的部分数据。
我有这个 GET 方法,它只是应该将模型保存到数据库中:
[HttpGet]
public async Task<IActionResult> PopulateDB()
{
var playerOneQuest = new StatusModel
{
PlayerId = "1",
points= 250,
completedSteps = new List<Status>()
{
new Status
{
Id = 11,
Index = 1
}
}
};
_context.Quest.Add(playerOneQuest);
await _context.SaveChangesAsync();
return Ok("Added data"); // Breakpoint here
}
当我在最后一行添加断点时,_context 看起来对所有数据都很好,但只要方法执行完毕,completedSteps 就会为空。其他数据 - PlayerId 和 points - 保存得很好。
我曾尝试在调用SaveChangesAsync() 之前添加此_context.Entry(playerOneQuest).State = EntityState.Added;,但在方法执行后completedSteps 仍以null 结束。
_context 定义为:
public class QuestContext : DbContext
{
public QuestContext(DbContextOptions<QuestContext> options)
: base(options){ }
public virtual DbSet<StatusModel> Quest { get; set; } = null!;
}
使用的2个模型定义为:
public class StatusModel
{
[Key]
public string? PlayerId {get;set;}
public long Points{get;set;}
public List<Status> completedSteps {get;set;} = null!;
}
public class Status
{
public long Id {get;set;}
public int Index {get;set;}
}
为了更好地衡量,这就是将数据库上下文添加到我的网络应用程序的方式:
builder.Services.AddDbContext<QuestContext>(opt =>
opt.UseInMemoryDatabase("Quests"));
【问题讨论】:
-
您是否尝试添加公共虚拟 DbSet
Status { get;放; } 到 QuestContext? -
@sam 是的,我确实尝试过。它没有效果,所以我再次删除它
-
实际上需要将状态添加到上下文中。根据 EF 导航规则,如果您将子实体定义/添加到上下文,则父实体将由 EF 本身解析。所以,我会添加 Status 并且在我们正在讨论的这种情况下,拥有 StatusModel 不是强制性的。您能否编辑您的问题,仅向我们展示如何在您的 StatusModel 和 Status 实体/对象中定义导航的部分?
-
您的 Status 和 StatusModel 实体看起来如何?您是否设置了导航属性、外键等? PK 是如何定义的 - 你真的可以设置 ID 还是它们是由数据库生成的?
-
@Sam 我之前确实读过一些类似的东西,但我不知道如果上下文是用“Status”定义的,我会在数据库中添加“StatusModel”
标签: c# .net-core entity-framework-core asp.net-core-webapi