C# NHibernate映射。设置已联接子类声明元素的集合和where属性
我正在从事一个项目,其中持久化数据可以标记为删除,但仍保留在数据库中,并将列(is_deleted)设置为TRUE 使用hibernate类映射属性“where”并将where=“is_deleted=0”添加到标记中,这样做很好。但当我声明一组子类元素时,它失败了 此简化示例使用类“Car”,该类包含从类“CarPart”继承的类“Wheel”的成员集合: 而不是正确的C# NHibernate映射。设置已联接子类声明元素的集合和where属性,c#,nhibernate,mapping,subclass,where,C#,Nhibernate,Mapping,Subclass,Where,我正在从事一个项目,其中持久化数据可以标记为删除,但仍保留在数据库中,并将列(is_deleted)设置为TRUE 使用hibernate类映射属性“where”并将where=“is_deleted=0”添加到标记中,这样做很好。但当我声明一组子类元素时,它失败了 此简化示例使用类“Car”,该类包含从类“CarPart”继承的类“Wheel”的成员集合: 而不是正确的 select * from Wheel w inner join CarPart cp on... where cp.is_
select * from Wheel w inner join CarPart cp on...
where cp.is_deleted = 0
- 这是虫子吗?还是我错过了一个机会 细节超级级卡帕特 已经有where=“is_deleted=0”, 所以从逻辑上讲,这应该适用于所有人 定义的子类
- 是否有其他方法添加 是否对所有持久化数据使用“已删除”标志 在尼伯内特
非常感谢您的帮助我强烈建议为每个软删除表创建一个视图,用于过滤已删除的记录并将视图映射到域模型中。这样做将使映射更容易
如果数据库支持,则可以在表上创建INSTEAD OF DELETE触发器,以设置is_deleted标志,而不是删除记录。这与视图相结合,允许您的域模型完全忽略软删除。感谢您的建议,尽管现在不可能进行重大架构更改。有效且99%干净的方法是将is_deleted列映射到子类(Wheel.IsDeleted而不是CarPart.IsDeleted)。但是,这意味着,如果删除或不删除Wheel(或其他子类)的子类实例,则CarPart表不存储信息,这是最理想的。不幸的是,如果您获取所有carpart,您也将获得删除的实例。如果你把所有的轮子都取出来,你只会得到0,这是可以接受的。我仍然希望有人能对此有所帮助。我认为实际的问题是where子句是纯SQL。要实现我想要的内容,需要where子句为HQL,这在imo中会更好。
select * from Wheel w inner join CarPart cp on...
where w.is_deleted = 0
select * from Wheel w inner join CarPart cp on...
where cp.is_deleted = 0