4

.NET 4 および Entity Framework 4 で Visual Studio 2010 を使用しています。EF4 ジェネレーターではなく、POCO クラスを使用しています。Equals()メソッドとメソッドをオーバーライドする必要がありますが、GetHashCode()実際には機能しません。誰もがすることだと思いましたが、オンラインで問題について何も見つかりません。

独自のクラスとEqualsメソッドを作成するときはEquals()、プロパティを使用します。これらは、EF によって読み込まれて埋められる必要があります。このような:

public class Item
{
    public virtual int Id { get; set; }
    public virtual String Name { get; set; }

    public virtual List<UserItem> UserItems { get; set; }
    public virtual ItemType ItemType { get; set; }

    public override bool Equals(object obj)
    {
        Item item = obj as Item;
        if (obj == null)
        {
            return false;
        }

        return item.Name.Equals(this.Name)
            && item.ItemType.Equals(this.ItemType);
    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode() ^ this.ItemType.GetHashCode();
    }
}

そのコードは機能しません。問題は にEqualsあり、取得しようとする場所または取得GetHashCodeしようとする場所にあります。Linq2Entites でデータを取得しようとすると、毎回 NullRefernceException が発生します。HashCodeEqualItemType

これを修正する汚い方法は、NullReferenceException をキャプチャしてfalse(Equals によって) 返され、 base.GetHashCode()(によってGethashCode) 返されることですが、この問題を修正するためのより良い方法があることを願っています。

DB および POCO ドメイン用の SQL スクリプト、EDMX ファイル、およびコンソール テストのメイン メソッドを使用して、小さなテスト プロジェクトを作成しました。ここからダウンロードできます: ダウンロード

4

1 に答える 1

0

プロキシ生成なしで純粋な POCO クラスを使用しています。この場合、遅延読み込みはサポートされていないため、関連するエンティティを自分で読み込むリポジトリ メソッドを作成する必要があります。それがあなたのItemTypeエンティティがnullである理由です(そして常にそうなります)。

遅延読み込みが必要な場合は、EF ジェネレーターを使用して、遅延読み込みをサポートする POCO クラスを構築できます。

于 2010-06-11T06:58:49.347 に答える