具有Nhibernate设计问题的域模型

我正试图开始使用“DDD with C#”世界。 我使用NHibernate作为我的ORM工具,因此尝试开发PI(Persistence Ignorance)模型。 但是,在我的一些实体(表示为POCOS)中,我在我的属性的setter中有业务规则。 例如,我有一个“User”实体,它有一个标志,指示此用户是否被阻止,当此标志为true时,必须自动填充当前日期的第二个字段“Block Date”。 一切看起来都非常清晰和简单,但问题出现在我恢复已经持久存储在数据库中的用户,即使被阻止的用户将其“阻止日期”更新到当前日期,根据这个逻辑。 最初我想到了第二个标志“isLoaded”,它表明NHibernate正在对象进行水合,然后这个逻辑不会被启动,但这看起来不像PI。 有关如何改善这一点的任何建议?

您可以在映射中为IsBlocked属性定义字段访问策略。 基本上,你会说NHibernate使用底层私有字段(_isBlocked)而不是属性,因此,不会执行IsBlocked属性中的setter逻辑。

这个SO问题对访问策略有很好的答案。

NHibernate官方文档 。

如果您使用Fluent NHibernate进行映射,则可以使用以下方法进行定义:

Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore); 

除了针对NHibernate问题的Miroslavs解决方案之外,我还是建议不要将逻辑放在属性设置器后面,特别是当需要更改其他字段时。

 public void Block() { _isBlocked = true; _blockedDate = DateTime.Now; } 

请查看此问题的答案。