假设我的WinForms应用程序有一个商业实体订单,该实体用于多个视图,每个视图处理应用程序中的不同域或用例。例如,一个管理订单,另一个管理订单并显示其他数据。如果我使用nHibernate(或任何其他ORM)并使用一个会话/ dataContext每个视图(或每db动作),我最终会得到两个不同的实例为同一个订单(让我们说orderId = 1 )。尽管在功能上是相同的实体,但它们在技术上是两个不同的实例。是的,我可以实现Equals/GetHashcode以使它们“看起来”相同。商业实体:私人实例VS单个实例
为什么你会为每个实体的单个实例与每个视图或每个用例的私有实例进行比较?
单个实例具有共享INotifyPropertyChanged事件并共享额外(非持久性)数据的优势。
在每个视图中拥有一个私有实例会为您提供视图级别撤消功能的灵活性。在上面的示例中,我允许用户更改订单详细信息,并为他们提供了不保存更改的灵活性。这里,视图/用例之间的同步发生在数据持久性级别上。
你的论点是什么?
有趣......但为什么*你应该*实现等于/ gethashcode?换句话说,为什么ORM构建器不只是返回一个实体的单个实例并让.NET处理相等?我猜我想要的是基于场景的最佳实践,它最好去私人实例,而不是仅仅接受它的方式...... – tofi9 2010-03-17 10:58:15
因为在大多数情况下,ORM *不能* 。假设**你**创建一个对象的实例。然后你坚持数据库。然后,使用ORM将相同的对象从数据库中拉出来。 ORM如何知道你更早实例化了那个对象?它所知道的只是缓存的内容。并且在很多情况下,对象上使用代理来协助跟踪已更改的属性。您*应该*实现它们,因为现在您可以比较对象之间的“业务对象”相等性。你真的关心它们是否是同一个实例吗?如果你这样做,保留你自己的缓存。 – snicker 2010-03-17 15:35:49