S#arp架构的Entity基类目前实现了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()后,它失败了。
有人可以解释为什么这不是问题吗?
答案 0 :(得分:0)
我最好的猜测是它不是问题,因为尖锐的架构使用每个请求模型的会话,因此对Session.Load(foo.Id)的调用将返回相同的Foo实例(如果删除会话。刷新和session.Clear测试应该通过),所以你正在测试的情况没有考虑到SharpArch应用程序。