FluentAssertions 在设置 ExcludingNestedObjects 时导致 ObjectDisposedException

FluentAssertions causing ObjectDisposedException when ExcludingNestedObjects is set

我有一个定义如下的 EF 模型:

public class ProgramManagerRolePermission
{
    [Key, Column(Order = 1)]
    public Guid ShardKey { get; set; }

    [Key, Column(Order = 2)]
    public Guid RoleId { get; set; }

    [Key, Column(Order = 3)]
    public Guid PermissionId { get; set; }

    [ForeignKey(nameof(RoleId))]
    public virtual ProgramManagerRole Role { get; set; }

    [ForeignKey(nameof(PermissionId))]
    public virtual ProgramManagerPermission Permission { get; set; }
}

我得到了以下测试代码:

using (var repo = IdentityProgramRepositoryFactory.Get())
{
    var role = repo.ProgramManagerRoles
        .Include(r => r.Permissions)
        .SingleOrDefault(r => r.Id == roleId);
    role.Permissions.Should().BeEquivalentTo(new[] {
        new Repo.ProgramManagerRolePermission
        {
            PermissionId = ProgramManagerPermissions.GrantOrRevokeRoles.Id,
            RoleId = roleId,
            ShardKey = identityProgramId
        },
        new Repo.ProgramManagerRolePermission
        {
            PermissionId = ProgramManagerPermissions.ManageNode.Id,
            RoleId = roleId,
            ShardKey = identityProgramId
        }
    }, options => options.ExcludingNestedObjects());
}

当我 运行 时,测试失败,因为抛出 ObjectDisposedException 消息:

Safe handle has been closed

如果我将最后一行更改为:

}, options => options.Excluding(p => p.Role).Excluding(p => p.Permission));

然后测试运行成功。

仅有的两个嵌套对象是 RolePermission。当我明确排除它们时,测试有效,当我告诉它排除所有嵌套对象时,它似乎仍在尝试浏览它们。

有人 运行 以前参与过这个吗?关于为什么我认为应该发生的事情没有任何解释?

您正在使用 ExcludingNestedObjects,这意味着它不会对 RolePermission 对象公开的对象进行结构比较。这些是您的根对象的属性。但它仍会尝试进行简单的相等性检查。