C# 在NHibernate中使用级联
我有两个类,叫做猴子和香蕉,它们之间有一对多的双向关系C# 在NHibernate中使用级联,c#,nhibernate,cascade,C#,Nhibernate,Cascade,我有两个类,叫做猴子和香蕉,它们之间有一对多的双向关系 Monkey monkey = new Monkey(); Banana banana = new Banana(); monkey.Bananas.Add(banana); banana.Monkey = monkey; hibernateService.Save(banana); 当我运行这段代码时,我希望monkey和banana都被持久化。然而,只有当我显式地拯救猴子时,它才能同时坚持这两种方法,反之亦然。最初,这是有意义的,因为
Monkey monkey = new Monkey();
Banana banana = new Banana();
monkey.Bananas.Add(banana);
banana.Monkey = monkey;
hibernateService.Save(banana);
当我运行这段代码时,我希望monkey和banana都被持久化。然而,只有当我显式地拯救猴子时,它才能同时坚持这两种方法,反之亦然。最初,这是有意义的,因为只有我的Monkey.hbm.xml具有cascade=“all”
的映射
Banana.hbm.xml
<class name="Monkey" table="monkies" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
<property name="Name" />
<set name="Bananas" inverse="true" cascade="all">
<key column="Id"/>
<one-to-many class="Banana"/>
</set>
</class>
<class name="Banana" table="bananas" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
<property name="Name" />
<many-to-one name="Monkey" column="Id" cascade="all" />
</class>
子映射(香蕉)不需要具有级联属性。如果删除了一个香蕉,猴子可能还有其他香蕉,但是当猴子被更改时,它的所有香蕉都应该相应地更改,因此只有猴子需要具有级联属性参数索引超出范围错误是由您的映射引起的。您已将Id映射为关系中的主键和外键。为便于将来参考,您还应为此类问题提供数据库架构,因为在不知道架构的情况下很难验证映射文件
我猜你把外键弄坏了。你说这个关系是一对多的,这意味着香蕉有一个指向猴子表的外键,对吗?此外键列的标准命名为MonkeyID,这是您的映射中似乎缺少的内容-您的所有列名似乎都是ID。James Ide在类似的行中回答,然后您说“ID是两个表中主键列的名称。我的关系映射应该是什么样子?”-确实,主键列的名称在两个表上都是Id是很好的,但这仍然不能描述这种关系。正如我上面提到的,您需要关系的外键
你应该发现,一旦你修复了你的关系,级联问题就会自行解决。人们通常希望从级联中执行的行为是将删除从父元素级联到子元素,但不是相反,在这种情况下,您可能希望对多对一元素使用cascade=“save update”,而不是cascade=“all”
最后,作为一个无耻的插头,你考虑过尝试吗?您可能会发现比hbm xml语法更容易学习。您所说的有道理,但我仍然发现
参数索引超出范围
,即使在从Banana.hbm中删除cascade属性后也是如此。确实,我的FK映射存在问题。我还没有尝试过Fluent NHibernate,但如果它有点像Java的JPA注释风格的Hibernate,那么它可能值得一看!
<class name="Monkey" table="monkies" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
<property name="Name" />
<set name="Bananas" inverse="true" cascade="all">
<key column="Id"/>
<one-to-many class="Banana"/>
</set>
</class>
<class name="Banana" table="bananas" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
<property name="Name" />
<many-to-one name="Monkey" column="Id" cascade="all" />
</class>