2011-10-12 132 views
1

如何映射具体类的集合属性,而不是接口? 它必须是具体的课程!我无法控制要映射的类,所以我无法更改为接口。nhibernate自定义集合映射

现在我试图通过编写自定义IUserCollectionType实现和自定义IPersistentCollection实现来解决此问题。

但是...以下异常停止亩进展:

Test method ShouldSaveEntityWithSections threw exception: 
NHibernate.StaleStateException: Batch update returned unexpected row count from update; actual row count: 0; expected: 1 

探查表明,NHibernate的不尝试插入相关实体到数据库中,但尝试更新它的外键的父对象。

的映射是这样的:

<set name="Rows" table="Rows" lazy="false" cascade="all" 
    collection-type="My.PersistentListType`1[Blabla.Row, Blabla], My"> 
    <key column="ParentID" not-null="true" /> 
    <one-to-many class="Blabla.Row, Blabla" /> 
</set> 

这是怎么回事?为什么不NHibernate插入子实体到数据库?

+0

你能告诉我们IUserCollectionType和IPersistentCollection实现吗?很可能有问题 – Firo

+0

不,问题在测试中。集合元素类型(在我的例子中是'Blabla.Row')没有默认的构造函数。相反,它有一个接受几个参数的参数之一,其中一个是用作主键值的“Guid”。我错误地通过了'Guid.NewGuid()'作为一个值,导致NHibernate认为该对象已经存在。 –

+1

考虑发布该答案并接受它 – Firo

回答

1

回答我自己的问题。希望它能帮助遇到同样问题的人。

该人应该检查他\她不创建一个相关的对象在一个状态,这导致NHibernate认为它已经持续。

在我的情况下,我错误地将映射为主键的属性设置为Guid.NewGuid()而不是Guid.Empty