NHibernate on delete=";“级联”;在很多方面都有关系

NHibernate on delete=";“级联”;在很多方面都有关系,nhibernate,one-to-many,cascade,Nhibernate,One To Many,Cascade,我有一个这样的对象模型: 文件夹-带有名称等的简单结构 文件-包含对包含该文件的文件夹的引用的复杂对象 文件夹不知道它的文件,我也不想让它知道。这种关系是多对一的,应该只在档案方知道 无论如何,我想依靠我的数据库的on DELETE CASCADE功能,这样当我删除文件夹时,我希望自动删除该文件夹中的所有文件。我不能使用NHibernate的级联,因为文件夹和文件之间没有关系 我知道在一对多关系的情况下,对于元素,我无法找到它在我的模型中的等价物-当关系在多个方面定义为时 我是做错了什么,还

我有一个这样的对象模型:

  • 文件夹
    -带有名称等的简单结构
  • 文件
    -包含对包含该文件的
    文件夹
    的引用的复杂对象
文件夹不知道它的文件,我也不想让它知道。这种关系是多对一的,应该只在档案方知道

无论如何,我想依靠我的数据库的on DELETE CASCADE功能,这样当我删除文件夹时,我希望自动删除该文件夹中的所有文件。我不能使用NHibernate的级联,因为文件夹和文件之间没有关系

我知道在一对多关系的情况下,对于
元素,我无法找到它在我的模型中的等价物-当关系在多个方面定义为


我是做错了什么,还是真的需要手动检查并删除已删除文件夹中的所有文件

您可以尝试使用
access=“noop”
来映射一对多的一面。这样,在类中不需要属性,但仍然具有映射

在Fluent NHibernate中,可能是这样的:

HasMany(Reveal.Member<Folder, IEnumerable<File>>("_files"))
   .KeyColumn("column_name")
   .Access.NoOp()
   .Inverse()
   .ForeignKeyCascadeOnDelete();
HasMany(leaver.Member(“\u文件”))
.KeyColumn(“列名称”)
.Access.NoOp()
.Inverse()
.ForeignKeyCascadeOnDelete();

注意:为此,您需要
文件夹
类中的
\u files
类型为
IEnumerable
的字段(Fluent NHibernate的限制,只能映射实际存在的字段或属性)。但是此字段可以始终为
null
,它将永远不会被使用。

只是为了确保:您知道
on delete
属性在运行时不起任何作用,只会影响hbm2ddl工具吗?您正在使用该工具生成数据库模式吗?是的,我想使用数据库级级联。没错,它必须由hbm2ddl生成。我的关系是否可能,或者我是否需要手动修改数据库?如果cascade=“all delete orphan”,则session.delete(文件夹);将自动删除与文件夹关联的所有文件。这就是你想要的吗?是的。假设那个文件夹不知道它的文件。听起来不错。你有没有办法用FluentNHibernate绘制地图?@A。。我已经编辑了我的答案,以显示流畅的NHibernate映射。