首页 > 解决方案 > 加载集合 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();

但这也行不通。

我做错了什么吗?

谢谢你的帮助!

标签: c#entity-frameworkentity-framework-core

解决方案


您可以使用 重置上下文 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);

此外,您可以考虑实施工作单元模式,以降低发生不相关更改的风险,这些更改将被还原。


推荐阅读