【发布时间】: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 Object 或 DTO (Data Transfer Object) 创建的,则会自动调用
Rollback()方法。由于我实现了 UnitOfWork 和 Repository 设计模式并在应用程序中使用了 IOC,我可以看到Rollback()方法被调用。首先,您应该检查数据库表中的非空字段不可为空。 -
@SercanSebetçi 我已经用 Repositories 和 IOC 实现了这个模式,我也创建了数据传输对象,不幸的是它似乎仍然产生相同的结果。无论如何,即使运行
_context.Users.RemoveAsync(user)然后调用_context.Users.ToListAsync()它仍然会产生同样的问题,因为被删除的用户仍然存在于数据集中。 -
在实体框架中,
DbContext已经是存储库,因此您真的不应该定义自己的“存储库”类,因为您只是在重新发明轮子。 (有一个类来保存常用的IQueryable<T>查询很好,但这不是一个存储库,只是一个实用程序/帮助类)。
标签: c# .net entity-framework-6