gpt4 book ai didi

c# - Equals 和 GetHashCode 中延迟加载的 NHibernate 属性

转载 作者:太空狗 更新时间:2023-10-29 22:17:24 30 4
gpt4 key购买 nike

如何处理下面的问题?

我们正在使用延迟加载 NHibernate属性以及每当我们调用 Equals()GetHashCode() 时使用的任何属性都将被延迟加载,从而可能导致延迟加载操作的级联。预加载可以用作替代方案,但我认为仅在特定情况下使用,而不是作为通用解决方案。

一个典型的场景是这样的:

public class AbstractSaveableObject {
[Id(0, Name = "Id", UnsavedValue = null)]
[Generator(1, Class = "native")]
public virtual long? Id { get; set; }
}

[Class(NameType = typeof(ClassA))]
public class ClassA : AbstractSavableObject {
[Bag(0, Inverse = true, Cascade = "none")]
[Key(1, Column = "ClassA")]
[OneToMany(2, ClassType = typeof(ClassB))]
public virtual ICollection<ClassB> ClassBs { get; set; }
}

[Class(NameType = typeof(ClassB))]
public class ClassB : AbstractSavableObject {

[ManyToOne(Column = "ClassA")]
public virtual ClassA ClassA { get; set; }

[ManyToOne]
public virtual ClassC ClassC { get; set; }

[ManyToOne]
public virtual ClassD ClassD { get; set; }

public virtual bool Equals(ClassB other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
return Equals(other.ClassC, ClassC) && Equals(other.ClassD, ClassD);
}
}

为简洁起见,省略了 GetHashCodeEquals(object) 的实现。

可以使用哪些策略来解决这个问题?

最佳答案

如果两个实体属于同一类型并且具有相同的主键,则它们是相等的。

如果你有整数键:

  1. 像现在一样检查引用相等性
  2. 如果您在某些基类中有 Equal 方法,您可以检查您正在比较的类型是否相等。在这里你可能会遇到代理问题,我会回到那个
  3. 检查主键是否相等——这不会导致任何延迟加载

如果您有 key 的 GUID:

  1. 像现在一样检查引用相等性
  2. 检查主键是否相等——这不会导致任何延迟加载

如果我有整数作为键,我通常在我的实体的基类中有类似这样的 Equal-override :

public virtual bool Equals(EntityBase other)
{
if (other == null)
{
return false;
}

if (ReferenceEquals(other, this))
{
return true;
}

var otherType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(other);
var thisType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(this);
if (!otherType.Equals(thisType))
{
return false;
}

bool otherIsTransient = Equals(other.Id, 0);
bool thisIsTransient = Equals(Id, 0);
if (otherIsTransient || thisIsTransient)
return false;

return other.Id.Equals(Id);
}

现在,如果您的实体从其他实体继承并使用每个层次结构的表,您将面临这样的问题:如果 GetClassWithoutInitializingProxy 是代理,则返回层次结构的基类;如果它是加载的实体,则返回更具体的类型。在一个项目中,我通过遍历层次结构并因此始终比较基本类型(代理与否)来解决这个问题。

在这些日子里,虽然我总是会使用 GUID 作为键并按照此处所述进行操作:http://nhibernate.info/doc/patternsandpractices/identity-field-equality-and-hash-code.html

那么就不存在代理类型不匹配的问题。

关于c# - Equals 和 GetHashCode 中延迟加载的 NHibernate 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5002670/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com