【问题标题】:cannot make changes in context persist无法使上下文中的更改持续存在
【发布时间】:2020-05-31 07:58:53
【问题描述】:

我正在开发一个简单的 3 层 MVC 应用程序,并且无法使上下文更改持续存在。这是我的代码:

控制器:

    [HttpPost]
    public IActionResult Register(UserDto user)
    {
        userService.Register(user);
        return Ok("profile");
    }

服务:

    public void Register(UserDto userDto)
    {
        User user = new User();
        user.FirstName = userDto.FirstName;
        user.LastName = userDto.LastName;
        user.Type = (UserType) userDto.Type;
        unitOfWork.UserRepository.AddAsync(user);
    }

存储库:

    public Repository(ApplicationDbContext dbContext)
    {
        this.dbContext = dbContext;
        this.dbSet = dbContext.Set<T>();
    }

    public async Task AddAsync(params T[] entities)
    {
        await dbSet.AddRangeAsync(entities);
        await SaveChanges();
    }

    private async Task SaveChanges()
    {
        await dbContext.SaveChangesAsync();
    }

使用我的调试器,我发现 dbset.AddRangeAsync 确实将我在请求中设置的实体添加到我的 dbContext 中。问题是,在下一个请求中,实体从 dbContext 中消失了,也没有出现在我的数据库中。有人可以解释我做错了什么吗?

【问题讨论】:

  • 你碰巧用过localdb吗?
  • 对不起,我不知道我是否使用localdb。对于数据库,我使用 SQLServerExplorer。它在我的 Users/{user} 文件夹中创建了一个 .mdf 文件。
  • 是的,localdb。请寻找有关类似 localdb 问题的其他问题。另外,作为一个附带问题,请查看答案并使您的代码始终异步。
  • 我刚刚注意到我的解决方案中没有 .mdf 文件,尽管我的数据库确实存在(它是空的,因为更改不会持续存在)。如果重要,我正在使用 EF Core。 .mdf 不存在是正常的还是这可能是问题所在?

标签: c# asp.net-mvc entity-framework n-tier-architecture


【解决方案1】:

您的 add 方法是异步的。调用此方法的其他方法必须是异步的。

 public async Task Register(UserDto userDto)
    {
        User user = new User();
        user.FirstName = userDto.FirstName;
        user.LastName = userDto.LastName;
        user.Type = (UserType) userDto.Type;
       await unitOfWork.UserRepository.AddAsync(user);
    }



    [HttpPost]
    public async Task<IActionResult> Register(UserDto user)
    {
       await userService.Register(user);
        return Ok("profile");
    }

【讨论】:

  • 没错,但这不是真正的问题。 SaveChanges 应该仍然可以工作。
  • 在控制器中,userService.Register(user)执行请求完成后,此时dbcontext被释放
  • 您确实有一点,但这应该会引发异常,这不是 OP 的经验,dbset.AddRangeAsync 确实添加了实体。这可能是另一个 localdb 混淆几乎总是当我看到“保存成功”+“不在数据库中”时 localdb 涉及。
  • 经过更多调试后,我发现:如果在 startup.cs 的 Configure 方法中,我在上下文中添加一个实体并保存更改,那么 AddRangeAsync 也将被保存。否则,它不会。你知道该怎么做吗?我什至不知道如何在其他 SO 问题上搜索此错误。
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多