注意:我以 C# 为例,但问题在 Java 和许多其他语言中几乎相同。
假设您实现了一个值对象(如M. Fowler 的值对象模式)并且它有一些可为空的字段:
class MyValueObject
{
// Nullable field (with public access to keep the example short):
public string MyField;
}
然后,当覆盖 Equals() 时,当两个值对象的 MyField 都设置为 null 时,您如何处理这种情况?他们是平等的还是不平等的?
在 C# 中,将它们视为平等似乎很明显,因为:
当您使用 C# 结构而不是类并且不覆盖 Equals() 时,这是 Equals() 的行为。
以下表达式为真:
null == null object.ReferenceEquals(null, null) object.Equals(null, null)
但是,在 SQL 中(至少在 SQL Server 的方言中),NULL = NULL
为假,而NULL is NULL
为真。
我想知道使用 O/R 映射器(在我的例子中是 NHibernate)时需要什么实现。如果你实现“自然”的 C# 相等语义,当 O/R 映射器将它们映射到数据库时可能会有任何不良影响吗?
或者也许允许值对象中的可空字段是错误的?