我有以下实体:
public class Entity1
{
public Guid ID { get; set; }
public override int GetHashCode()
{
return ID.GetHashCode();
}
}
public class Entity2
{
public Dictionary<Entity1,int> Dict { get; set; }
}
我正在覆盖 Entity1 的 GetHashCode 以反映它的 ID,因为它是它拥有的最不可变的属性,而不是通过引用留下它,因为我有多个会话正在运行并且字典需要是“会话”安全的。
对于这个讨论,我在字典中有一个 int 值,该值并不真正相关。
两个实体都使用 NHibernate 正确映射。
可以说我有这个代码:
using (var session = GetSession())
{
var entity1 = new Entity1();
var entity2 = new Entity2();
entity2.Dict[entity1] = 1;
session.SaveOrUpdate(entity1);
session.SaveOrUpdate(entity2);
}
在此代码中,Dict 不会保存任何键、值 - 因为在保存之前将 entity1 添加到 Dict 时会给它一个空 ID 的哈希码,在哈希码之后将在保存时更改为实际 ID,从而破坏字典。
我正在寻找最佳实践/最佳解决方案。
我目前的选择:
请记住这一点,在将 Entity1 添加到任何字典之前始终保存它(我有一堆)。我不喜欢这个选项,因为它真的不是万无一失的,而且我相信其他人以后不会注意这一点并制造可怕的错误。
保存之前 - 总是通过键,值收集,保存键,并将它们重新插入字典,这个解决方案似乎真的缺乏性能,并导致各种不同的问题。但最重要的是——听起来应该有更好的解决方案。
处理这种情况的最佳方法是什么?