2011-04-01 90 views
1

我不确定如何映射集合以进行更新。 我有2个表:NHibernate集合映射:它是删除并插入而不是更新

  • 对象 - 有3个整数
  • ObjectAliases复合PK - 有FK到对象和名称一个nvarchar的PK,显然名称是唯一

对象可以有许多别名,但别名对每个对象都是唯一的。

所以我需要列出别名,在我的对象,所以我所做的:

public virtual IList<string> Aliases { get; set; } 

和我的映射是:

<bag name="Aliases" table="Aliases" cascade="all-delete-orphan" lazy="true"> 
    <key> 
    <column name="OtpadId_Djelatnost" sql-type="nvarchar"/> 
    <column name="OtpadId_Proces" sql-type="nvarchar"/> 
    <column name="OtpadId_Vrsta" sql-type="nvarchar"/> 
    </key> 
    <element column="Ime" type="String"/> 
</bag> 

我可以创建和删除别名列表对象没有问题, Nhibernate会插入并删除罚款。但我如何重命名别名?我有名字FK到Alias,当我重命名一个别名时,我希望NHibernate执行sql UPDATE,因此UPDATE CASCADE在所有FK上执行,引用新名称。

如果我做的:

object.Aliases[0] = "test"; 

NHibernate的会尽量做一个INSERT而不是UPDATE ..我怎么可以把它做的更新?

谢谢大家。

回答

1

一个包是无序和无索引的集合(从http://www.nhforge.org/doc/nh/en/index.html#collections-mapping)。所以我想这是因为删除了一个重新创建其内容的事实。

+0

你是完全正确的......我发现这句话:“NHibernate不能单独创建,删除或更新行,因为没有可用于识别单个行的密钥。” ..所以我会尝试索引收集和报告。 – 2011-04-01 22:02:43

+0

我发现你不能这样做(用我的表格结构)。如果您尝试使用索引列表,您需要一个索引列,它不能与元素列相同。 最后,我通过将inverse =“true”放在列表中并自己管理更新别名来解决它。 – 2011-04-05 07:30:44

相关问题