C# 加载集合EF Core的原始值

C# 加载集合EF Core的原始值,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我使用的是EF core的当前版本,无法加载原始值 我有以下星座: 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&g

我使用的是EF core的当前版本,无法加载原始值

我有以下星座:

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; }
}
之后,我想“恢复”这一步,并尝试使用重新加载

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,则可以使用

注意:@AluanHaddad在问题的一条评论中说,这将恢复所有未保存的更改。您可以使用linq
Where
表达式来限制哪些对象的状态已重置:

dbContext.ChangeTracker.Entries()
.Where(e => e.Entity is UserRole)
.Where(e => e => e.State = EntityState.Added)
.ToList()
.ForEach(e => e.State = EntityState.Detached);

此外,您可以考虑实现这样一种情况,即减少与不相关的更改发生还原的风险。

恢复到集合中的集合-从集合中移除项。ChangeTracker的其他黑客可能会有问题。因此,请创建新的DbContext并重新加载实体。不客气。我现在将创建一个答案。注意
.Clear()
将还原所有未保存的更改。这一点很好@AluanHaddad。我忘了提那件事了。我已经在答案中添加了这些信息。我使用IDbContextFactory,所以范围必须非常短。否则,我的blazor应用程序可能会出现并发问题
dbContext.ChangeTracker.Entries()
.Where(e => e.Entity is UserRole)
.Where(e => e => e.State = EntityState.Added)
.ToList()
.ForEach(e => e.State = EntityState.Detached);