首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetHashCode集合-覆盖等于和GetHashCode

GetHashCode集合-覆盖等于和GetHashCode
EN

Stack Overflow用户
提问于 2013-04-09 18:31:51
回答 1查看 2.2K关注 0票数 1

在EF中,我与一个连接表有很多到多的关系。

在其他问题中,我似乎有一些建议,可以在许多关系中使用Hashset集合类型,并覆盖等于()和GetHashCode()。

为什么我要使用哈希集?

如何覆盖这些方法,以及它实现了什么?

代码语言:javascript
复制
public class ChartQuery
{
    public int ChartQueryId { get; set; }
    public virtual ICollection<UserChartQuery> Users { get; set; }
   ...more...
}

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<UserChartQuery> SavedChartQueries { get; set; }
    ...more...
}

public class UserChartQuery
{
    public int UserId { get; set; }
    public int ChartQueryId { get; set; }

    public virtual User User { get; set; }
    public virtual ChartQuery ChartQuery { get; set; }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 20:24:12

为什么我要使用哈希集?

不应该,只要正确映射,多到多行的唯一性将在数据库级别强制执行。在应用程序级别强制执行它几乎没有什么好处。

如何覆盖这些方法,以及它实现了什么?

实体框架中的多对多关系没有单独的实体来表示关系,因此没有实体可以覆盖Equals()GetHashCode()

您可以定义一个实体来满足多到多的关系,但从对象模型的角度来看,这是有些人为的和丑陋的。如果要这样做,您将覆盖Equals()GetHashCode(),并将相等定义为相互相等的参与键,而哈希代码将是参与键的唯一组合。

更新

使用表示多到多关系的实体的示例,您将如何实现EqualsGetHashCode,以便在HashSet中正确地使用它:

代码语言:javascript
复制
public class UserChartQuery
{
    public int UserId { get; set; }
    public int ChartQueryId { get; set; }

    public virtual User User { get; set; }
    public virtual ChartQuery ChartQuery { get; set; }

        protected bool Equals(UserChartQuery other)
    {
        return UserId == other.UserId && ChartQueryId == other.ChartQueryId;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((UserChartQuery) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return (UserId*397) ^ ChartQueryId;
        }
    }
}

如前所述,我建议使用更自然和内置的方式,在EF中建立多到多的关系:

代码语言:javascript
复制
public class ChartQuery
{
    public int ChartQueryId { get; set; }
    public virtual ICollection<User> Users { get; set; }
   ...more...
}

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<ChartQuery> SavedChartQueries { get; set; }
    ...more...
}

然后,在映射中,将多到多的关系定义为这样(在DbContext OnModelCreating覆盖中):

代码语言:javascript
复制
builder.Entity<ChartQuery>()
    .HasMany(cq => ucq.Users)
    .WithMany(u => u.SavedChartQueries);

在这两种情况下,我都认为使用HashSet是不必要的。即使使用实体来满足多到多的关系,数据库也将强制执行组合密钥的唯一性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15909797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档