c# - 加载集合 EF Core 的原始值
问题描述
我正在使用当前版本的 EF 内核,但无法加载原始值。
我有以下星座:
public class User
{
public string Name { get; set; }
public ICollection<UserRole> UserRoles { get; set; }
}
public class UserRole
{
public string Name { get; set; }
public ICollection<User> Users { get; set; }
}
现在我向用户添加一个新的 UserRole - 类似的东西
user.UserRoles.Add(new UserRole() {Name="Admin", User=user}
之后我想“恢复”这一步并尝试使用 Reload
dbContext.Entry(user).Reload();
但是仍然有新角色添加到集合中。我也试过
dbContext.Entry(user).Collection(x=>x.UserRole).Load();
但这也行不通。
我做错了什么吗?
谢谢你的帮助!
解决方案
您可以使用 重置上下文
dbContext.ChangeTracker.Entries()ToList().ForEach(e => e.State = EntityState.Detached);
。如果您使用的是 EF Core 5.0,则可以使用ChangeTracker.Clear()。
注意:正如@AluanHaddad 在对该问题的评论之一中所说,这将恢复所有未保存的更改。您可以使用 linqWhere
表达式来限制哪些对象的状态重置:
dbContext.ChangeTracker.Entries()
.Where(e => e.Entity is UserRole)
.Where(e => e => e.State = EntityState.Added)
.ToList()
.ForEach(e => e.State = EntityState.Detached);
此外,您可以考虑实施工作单元模式,以降低发生不相关更改的风险,这些更改将被还原。
推荐阅读
- c# - Xamarin 使用 Microsoft.Extensions.DependencyInjection 形成依赖注入
- ios - SwiftUI DatePicker -- 根本不允许日期?
- cocoa - 侧边栏自动调整以适应系统偏好中的图标大小变化
- c - 应该进行哪些更改才能在屏幕上生成以下图案?***** **** *** ** *
- node.js - 我无法安装包 quick.db
- java - 在 Hibernate 中是否可以使用可选的 ElementCollections
- python - 如何使用变量的值而不是数字
- azure - Azure 管道 - Azure 网络负载均衡器任务如何工作?
- python - 从 PyTorch 导出的 ONNX InferenceSession ONNX 模型失败
- count - 循环内变量为数据子集获取的唯一值的数量