1

EF の結合テーブルと多対多の関係があります。

Hashset他の質問で、多対多の関係にコレクション型を使用し、Equals() と 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; }

}
4

1 に答える 1

2

なぜハッシュセットを使用する必要があるのですか?

すべきではありません。多対多の行の一意性は、適切にマップされている限り、データベース レベルで適用されます。アプリケーション レベルで強制するメリットはほとんどありません。

これらのメソッドをオーバーライドするにはどうすればよいですか? また、これにより何が達成されますか?

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 を使用する必要はないと本当に思います。エンティティが多対多の関係を満たす場合でも、データベースは複合キーの一意性を強制します。

于 2013-04-11T20:24:12.683 に答える