Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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中使用级联_C#_Nhibernate_Cascade - Fatal编程技术网

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>