【问题标题】:.NET Entity Framework - Deleted rows seem to be caching.NET Entity Framework - 删除的行似乎正在缓存
【发布时间】:2021-12-11 13:14:07
【问题描述】:

我正在尝试使用 Blazor Server 来显示用户列表,然后能够通过 CRUD 管理他们。

我编写了一个 UserRepository,其中包含以下代码:

public class UserRepository : IUserRepository 
{
  private readonly ApplicationContext _applicationContext;

  public UserRepository(ApplicationContext applicationContext)
  {
     _applicationContext = applicationContext;
  }

  public Task<List<User>> GetAllUsers()
  {
      return _applicationContext.Users.ToListAsync();
  }

  public Task DeleteUser(User user)
  {
      _applicationContext.Users.Remove(user);
      return SaveChanges();
  }

  private Task<int> SaveChanges()
  {
      return _applicationContext.SaveChangesAsync();
  }
}

然后在我的 Blazor 服务器页面中,我正在执行以下操作:

protected override async Task OnInitializedAsync()
{
    _users = await GetUsers();
}

private async void onDeleteUser(User user)
{
  await _userRepository.DeleteUser(user);
  await GetUsers();
}

private Task<List<User>> GetUsers()
{
    return _userRepository.GetAllUsers();
}

问题出在 Delete 方法中,我可以看到用户正在从数据库中删除,正如我所期望的那样,但是当再次调用 GetAllUsers 方法时,它似乎正在返回已删除的行。

我曾尝试使用AsNoTracking,但这似乎产生了相同的结果。

【问题讨论】:

  • 我之前也遇到过类似的问题。如果数据库表设计不是使用 Entity ObjectDTO (Data Transfer Object) 创建的,则会自动调用Rollback() 方法。由于我实现了 UnitOfWorkRepository 设计模式并在应用程序中使用了 IOC,我可以看到 Rollback() 方法被调用。首先,您应该检查数据库表中的非空字段不可为空。
  • @SercanSebetçi 我已经用 Repositories 和 IOC 实现了这个模式,我也创建了数据传输对象,不幸的是它似乎仍然产生相同的结果。无论如何,即使运行 _context.Users.RemoveAsync(user) 然后调用 _context.Users.ToListAsync() 它仍然会产生同样的问题,因为被删除的用户仍然存在于数据集中。
  • 在实体框架中,DbContext 已经是存储库,因此您真的不应该定义自己的“存储库”类,因为您只是在重新发明轮子。 (有一个类来保存常用的IQueryable&lt;T&gt; 查询很好,但这不是一个存储库,只是一个实用程序/帮助类)。

标签: c# .net entity-framework-6


【解决方案1】:

您必须将此功能设置为异步或使其同步(取决于您)

private async Task<int> SaveChanges()
  {
      return await _applicationContext.SaveChangesAsync();
  }

private int SaveChanges()
  {
      return  _applicationContext.SaveChanges();
  }

和删除用户

public async Task<int> DeleteUser(User user)
  {
      _applicationContext.Users.Remove(user);
      return  await SaveChanges();
  }

public int DeleteUser(User user)
  {
      _applicationContext.Users.Remove(user);
      return SaveChanges();
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多