S # arp Базовый класс Entity Architecture в настоящее время реализует GetHashCode следующим образом:
public override int GetHashCode()
{
if (cachedHashcode.HasValue)
return cachedHashcode.Value;
if (IsTransient())
{
cachedHashcode = base.GetHashCode();
}
else
{
unchecked
{
int hashCode = GetType().GetHashCode();
cachedHashcode = (hashCode * HASH_MULTIPLIER) ^ Id.GetHashCode();
}
}
return cachedHashcode.Value;
}
Я использую биты архитектуры S # arp в своем приложении (но не во всей системе).
Эта конкретная реализация GetHashCode, кажется, вызывает у меня проблемы в некоторых из моих модульных тестов.Причина в том, что хеш-код кэшируется, поэтому, если GetHashCode вызывается для сущности, после изменения сущности исходный хеш-код продолжает возвращаться.
Теперь, возможно, именно такое поведение желали разработчики S # arp, но мне тоже это кажется странным.
Например:
[Test]
public void Test()
{
var foo = new Foo();
// Console.WriteLine(foo.GetHashCode());
Session.Save(foo);
Session.Flush();
Session.Clear();
var reloadedFoo = Session.Load<Foo>(foo.Id);
Assert.That(reloadedFoo.GetHashCode() == foo.GetHashCode());
}
Этот тест проходит, но после того, как я раскомментирую первый вызов GetHashCode (), он не пройден.
Может кто-нибудь объяснить, почему это не проблема?