Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate映射。设置已联接子类声明元素的集合和where属性_C#_Nhibernate_Mapping_Subclass_Where - Fatal编程技术网

C# NHibernate映射。设置已联接子类声明元素的集合和where属性

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_

我正在从事一个项目,其中持久化数据可以标记为删除,但仍保留在数据库中,并将列(is_deleted)设置为TRUE

使用hibernate类映射属性“where”并将where=“is_deleted=0”添加到标记中,这样做很好。但当我声明一组子类元素时,它失败了

此简化示例使用类“Car”,该类包含从类“CarPart”继承的类“Wheel”的成员集合:

而不是正确的

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