在EF中,我与一个连接表有很多到多的关系。
在其他问题中,我似乎有一些建议,可以在许多关系中使用Hashset集合类型,并覆盖等于()和GetHashCode()。
为什么我要使用哈希集?
如何覆盖这些方法,以及它实现了什么?
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; }
}发布于 2013-04-11 20:24:12
为什么我要使用哈希集?
不应该,只要正确映射,多到多行的唯一性将在数据库级别强制执行。在应用程序级别强制执行它几乎没有什么好处。
如何覆盖这些方法,以及它实现了什么?
实体框架中的多对多关系没有单独的实体来表示关系,因此没有实体可以覆盖Equals()和GetHashCode()。
您可以定义一个实体来满足多到多的关系,但从对象模型的角度来看,这是有些人为的和丑陋的。如果要这样做,您将覆盖Equals()和GetHashCode(),并将相等定义为相互相等的参与键,而哈希代码将是参与键的唯一组合。
更新
使用表示多到多关系的实体的示例,您将如何实现Equals和GetHashCode,以便在HashSet中正确地使用它:
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中建立多到多的关系:
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覆盖中):
builder.Entity<ChartQuery>()
.HasMany(cq => ucq.Users)
.WithMany(u => u.SavedChartQueries);在这两种情况下,我都认为使用HashSet是不必要的。即使使用实体来满足多到多的关系,数据库也将强制执行组合密钥的唯一性。
https://stackoverflow.com/questions/15909797
复制相似问题