我正在尝试编写一个小型 Web api,这是我第一次使用 Entity Framework 。
我的问题是只保存了部分数据。
我有这个 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"));
最佳答案
问题在于您没有指定要加载其他数据。
https://learn.microsoft.com/en-us/ef/core/querying/related-data/
您可以通过代理启用延迟加载:https://learn.microsoft.com/en-us/ef/core/querying/related-data/lazy或者通过在查询中使用 .Include()
来明确显示。
varcompleteList=await_questContext.Quest.Include(i=>i.completedSteps).ToListAsync();
据我所知,您的实体是通过遵循约定正确设置的。这意味着当您只想建立简单的一对多关系时,您不需要配置任何有关实体的附加信息。
注入(inject) QuestContext
的 Controller 示例:
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
private readonly QuestContext _questContext;
public MyController(QuestContext questContext)
{
_questContext = questContext;
}
[HttpGet]
public async Task<NoContentResult> Get()
{
var playerOneQuest = new StatusModel
{
PlayerId = "1",
Points = 250,
completedSteps = new List<Status>()
{
new Status
{
Id = 11,
Index = 1
}
}
};
_questContext.Quest.Add(playerOneQuest);
await _questContext.SaveChangesAsync();
return NoContent();
}
[HttpGet("check")]
public async Task<List<StatusModel>> Check()
{
var completeList = await _questContext.Quest.Include(i => i.completedSteps).ToListAsync();
return completeList;
}
}
关于c# - Entity Framework 仅保存我的一些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70972283/