0

私はこの3日間、少なくとも私にとってはおかしな行動に苦しんでいます。基本的な概念は次のとおりです。オブジェクトはメモリ内に作成され、このオブジェクトには子のリストがあります。このオブジェクトはDBに保存され、子もカスケードモードで保存されます。これは正常に機能しますが、保存後に1つの子を削除しようとして、リストから削除しようとすると、これは機能せず、リストは子を削除しません。私が見つけたのは、リスト、HashedSetタイプ、オブジェクトが最初にリストに挿入されたとき、保存前、保存後、同じオブジェクトが同じハッシュコードを持っていないときに、どういうわけかオブジェクトのハッシュコードをキャッシュすることです。ただし、リストは引き続き古いハッシュコードを想定しています。私はとを上書きしました、たくさんのグーグルと読書の後、私はブログ投稿を見つけGetHashCodeましEqualsこれは、nhibernateがGetHashCodeandEqualsメソッドを使用する方法を説明しています。

これは私の実装です

    public override int GetHashCode()
    {
        if (orgHashCode.HasValue)
            return orgHashCode.Value;

        var hashCode = 17;
        var signatureProperties = GetSignatureProperties();

        if (!IsTransient())
            hashCode = (hashCode*HASH_MULTIPLIER) ^ GetIdValue().GetHashCode();
        else
        {
            foreach (var property in signatureProperties)
            {
                object value = property.GetValue(this, null);

                if (value != null)
                    hashCode = (hashCode*HASH_MULTIPLIER) ^ value.GetHashCode();
            }
        }

        if (!orgHashCode.HasValue)
            orgHashCode = hashCode;


        // If no properties were flagged as being part of the signature of the object,
        // then simply return the hashcode of the base object as the hashcode.
        return signatureProperties.Any() ? hashCode : base.GetHashCode();
   }

    public override bool Equals(object obj)
    {
        var compareTo = obj as DbCommonBase;

        if (ReferenceEquals(this, compareTo))
            return true;

        return compareTo != null &&
                GetType().Equals(compareTo.GetUnproxiedType()) &&
                (HasSameNonDefaultIdAs(compareTo) || ((IsTransient()) || compareTo.IsTransient()) &&
                HasSameObjectSignatureAs(compareTo));
    }

最初のハッシュコードが生成される前にハッシュコードを返すorgHashCodeという変数を使用しました。このメソッドを使用すると、機能するように見えますが、これは最善の解決策ではないと思います。ハッシュコードは現在のオブジェクトに対して生成されるべきであり、それの「最初のバージョン」のために。

私の説明が十分に明確であるかどうかはわかりません。ヒントをいただければ幸いです。ありがとう

4

2 に答える 2

0

all-delete-orphanへのカスケード モードはありますか? このカスケード モードでは、オブジェクトがコレクションから削除されるときにオブジェクトを削除できます。

于 2011-06-08T06:35:14.030 に答える
0

私の問題に対する答えが見つかりました。子リストを保持する辞書の問題です。これは、オブジェクトの HashCode を使用してキーを格納します。私の場合のように、オブジェクトの GetHashCode がオーバーライドされている場合、値を返す必要があります。オブジェクトの存続期間中は不変である必要がありますが、私の場合はそうではありません。そのため、アイテムがリストに追加されると、GetHashCode は 1 つの値を返しますが、オブジェクトをデータベースに保存した後、GetHashCode は変更されますが、ディクショナリはオブジェクトの元の HashCode を保持します。リストに存在するにもかかわらず、ディクショナリがオブジェクトを見つけられない この質問は、私の問題をよりよく説明できます

于 2011-06-08T13:21:59.693 に答える