c# - Entity Framework 仅保存我的一些字段

标签 c# .net-core entity-framework-core asp.net-core-webapi

我正在尝试编写一个小型 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 将为空。其他数据 - PlayerIdpoints - 保存得很好。

我尝试在调用 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/

相关文章:

c# - 使用 C# 代码创建 SQL Express 2008 数据库,但尝试与系统管理员连接时登录失败

c# - Serilog 不将日志写入文件

asp.net-core - 更新数据库调用特定迁移

c# - ef 核心一对多关系抛出异常无法添加或更新子行

asp.net-core - EF Core 2.2,当层次结构中有多个时,拥有的实体生成为另一个表

c# - 传递字典以在 HTML/Razor 中完全查看和使用它

C# 属性信息

c# - Startup.cs 返回错误的环境

azure - 通过Proxy .net core连接Azure存储

c# - EF Core回滚迁移错误: column of invalid type to be used as key column