IEquatable中断了Entity Framework实体的加载

詹姆斯·桑皮卡

我想比较记录以查看它们之间是否存在差异。

Person 桌子:

ID    Name          Address
--------------------------------
1     John Smith    123 A Street
2     John Smith    123 A Street
3     John Smith    234 B Street

记录1和2是“相等的”。记录2和3是“不相等”。

我已经IEquatable在模型上实现Person如下。

public static bool operator ==(Person p1, Person p2)
{
    if (System.Object.ReferenceEquals(p1, p2)) return true;

    return p1.Equals(p2);
}

public static bool operator !=(Person p1, Person p2)
{
    return !(p1== p2);
}

public bool Equals(Person other)
{
    if (System.Object.ReferenceEquals(this, other)) return true;

    if (Name != other.Name) return false;
    if (Address != other.Address) return false;

    return true;
}

public override bool Equals(object obj)
{
    Person person = obj as Person;
    if (person == null) return false;

    return Equals(person);
}

public override int GetHashCode()
{
    unchecked
    {
        int hash = (int)2166136261;
        hash = hash * 25165843 ^ (Name != null ? Name .GetHashCode() : 0);
        hash = hash * 25165843 ^ (Address != null ? Address.GetHashCode() : 0);

        return hash;
    }
}

问题是,Persons实现导航属性中ICollection它缺少彼此“相等”的记录(即返回单个John Smith 123 A Street记录)。我猜这是因为默认情况下,它会考虑具有唯一主键的不同实体。通过覆盖等于,它认为两条记录都是同一实体。

屏幕截图显示为Addresses而不是Persons:(顶部为带IEquatable,底部为不带) 在此处输入图片说明

//Addresses Definition (generated code)
public virtual ICollection<Address> Addresses { get; set; }

我如何调和需要在对象级别看到平等的EF与我想看到逻辑相等的EF?

查尔斯·玛格

关键似乎在EF源代码中

在的注释中EntityUtil.DetermineCollectionType(Type requestedType),有以下“规则”:

    // The rules are:
    // If the collection is defined as a concrete type with a publicly accessible parameterless constructor, then create an instance of that type
    // Else, if HashSet{T} can be assigned to the type, then use HashSet{T}
    // Else, if List{T} can be assigned to the type, then use List{T}
    // Else, throw a nice exception.

因此,由此看来,EF将为HashSet<Address>您的导航属性添加一个新的这将使用默认的相等比较器,并防止添加任何重复项。当您的Equals实现将您的两个结果均等时,将仅包含其中一个。

实体通常是唯一标识的-Equals忽略唯一标识符的覆盖可能不正确。最好的解决方案是删除覆盖并实施单独的IEqualityComparer大多数使用相等语义的方法都将其作为参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Entity Framework Core加载相关实体

来自分类Dev

插入/添加后在Entity Framework中强制重新加载实体

来自分类Dev

如何在不延迟加载Entity Framework的情况下加载嵌套实体?

来自分类Dev

我可以通过实体拆分在Entity Framework 6中延迟加载实体的一部分吗?

来自分类Dev

加载具有1到0..1关系的实体时出错Entity Framework

来自分类Dev

使用Entity Framework加载具有大字符串属性的实体时性能不佳

来自分类Dev

在Entity Framework中使用相关实体更新分离的实体

来自分类Dev

Entity Framework Core 获取没有相关实体的实体

来自分类Dev

使用Entity Framework 6.0删除实体

来自分类Dev

与Linq相交的Entity Framework实体中的元素

来自分类Dev

使用Entity Framework 6.0删除实体

来自分类Dev

OnDestroyActionMode()中断了onActionItemClicked()

来自分类Dev

使用DTO在Entity Framework中延迟加载

来自分类Dev

使用ViewModel和Entity Framework 6更新实体吗?

来自分类Dev

使用Entity Framework 4.0时需要删除多个实体对象

来自分类Dev

如何使用Entity Framework + OData发布多个相关实体?

来自分类Dev

使用Entity Framework 4.0时需要删除多个实体对象

来自分类Dev

使用select将Entity Framework实体映射到dto对象

来自分类Dev

在 Entity Framework Core 中添加实体图

来自分类Dev

使用 Entity Framework 6 插入断开的相关实体

来自分类Dev

Entity Framework Core是否具有防止子实体或父实体更新的简单方法?

来自分类Dev

一种搜索实体的方法,该实体的某些属性与Entity Framework中的给定条件匹配

来自分类Dev

Blobstore:服务中断了吗?

来自分类Dev

留言中断了吗?

来自分类Dev

pytest中断了pip安装

来自分类Dev

Blobstore:服务中断了吗?

来自分类Dev

我的功能中断了网站

来自分类Dev

grep中断了systemctl的格式

来自分类Dev

如何全局禁用Entity Framework 7中的延迟加载?

Related 相关文章

  1. 1

    如何使用Entity Framework Core加载相关实体

  2. 2

    插入/添加后在Entity Framework中强制重新加载实体

  3. 3

    如何在不延迟加载Entity Framework的情况下加载嵌套实体?

  4. 4

    我可以通过实体拆分在Entity Framework 6中延迟加载实体的一部分吗?

  5. 5

    加载具有1到0..1关系的实体时出错Entity Framework

  6. 6

    使用Entity Framework加载具有大字符串属性的实体时性能不佳

  7. 7

    在Entity Framework中使用相关实体更新分离的实体

  8. 8

    Entity Framework Core 获取没有相关实体的实体

  9. 9

    使用Entity Framework 6.0删除实体

  10. 10

    与Linq相交的Entity Framework实体中的元素

  11. 11

    使用Entity Framework 6.0删除实体

  12. 12

    OnDestroyActionMode()中断了onActionItemClicked()

  13. 13

    使用DTO在Entity Framework中延迟加载

  14. 14

    使用ViewModel和Entity Framework 6更新实体吗?

  15. 15

    使用Entity Framework 4.0时需要删除多个实体对象

  16. 16

    如何使用Entity Framework + OData发布多个相关实体?

  17. 17

    使用Entity Framework 4.0时需要删除多个实体对象

  18. 18

    使用select将Entity Framework实体映射到dto对象

  19. 19

    在 Entity Framework Core 中添加实体图

  20. 20

    使用 Entity Framework 6 插入断开的相关实体

  21. 21

    Entity Framework Core是否具有防止子实体或父实体更新的简单方法?

  22. 22

    一种搜索实体的方法,该实体的某些属性与Entity Framework中的给定条件匹配

  23. 23

    Blobstore:服务中断了吗?

  24. 24

    留言中断了吗?

  25. 25

    pytest中断了pip安装

  26. 26

    Blobstore:服务中断了吗?

  27. 27

    我的功能中断了网站

  28. 28

    grep中断了systemctl的格式

  29. 29

    如何全局禁用Entity Framework 7中的延迟加载?

热门标签

归档