なぜハッシュセットを使用する必要があるのですか?
すべきではありません。多対多の行の一意性は、適切にマップされている限り、データベース レベルで適用されます。アプリケーション レベルで強制するメリットはほとんどありません。
これらのメソッドをオーバーライドするにはどうすればよいですか? また、これにより何が達成されますか?
Entity Framework の多対多のリレーションシップには、リレーションシップを表す個別のエンティティがないため、上書きするエンティティはありませ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 を使用する必要はないと本当に思います。エンティティが多対多の関係を満たす場合でも、データベースは複合キーの一意性を強制します。