私はこの3日間、少なくとも私にとってはおかしな行動に苦しんでいます。基本的な概念は次のとおりです。オブジェクトはメモリ内に作成され、このオブジェクトには子のリストがあります。このオブジェクトはDBに保存され、子もカスケードモードで保存されます。これは正常に機能しますが、保存後に1つの子を削除しようとして、リストから削除しようとすると、これは機能せず、リストは子を削除しません。私が見つけたのは、リスト、HashedSet
タイプ、オブジェクトが最初にリストに挿入されたとき、保存前、保存後、同じオブジェクトが同じハッシュコードを持っていないときに、どういうわけかオブジェクトのハッシュコードをキャッシュすることです。ただし、リストは引き続き古いハッシュコードを想定しています。私はとを上書きしました、たくさんのグーグルと読書の後、私はブログ投稿を見つけGetHashCode
ましたEquals
これは、nhibernateがGetHashCode
andEquals
メソッドを使用する方法を説明しています。
これは私の実装です
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という変数を使用しました。このメソッドを使用すると、機能するように見えますが、これは最善の解決策ではないと思います。ハッシュコードは現在のオブジェクトに対して生成されるべきであり、それの「最初のバージョン」のために。
私の説明が十分に明確であるかどうかはわかりません。ヒントをいただければ幸いです。ありがとう