在我的班级案例中,我有一个 IDictionary,其中实体(类)作为键,角色(枚举)作为值。当尝试保存 Case 的新实例(非持久化)时,IDictionary 中填充了 Entity 的新实例,我收到以下错误:
NHibernate.TransientObjectException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:实体
这些是类(角色是一个枚举):
public class Case
{
public Case { EntityCollection = new Dictionary<Entity, Roles>(); }
public virtual int Id { get; set; }
public virtual IDictionary<Entity, Roles> EntityCollection { get; set; }
}
和
public class Entity
{
public virtual int Id { get; set; }
}
映射如下:
<class name="Case" table="[Case]">
<id name="Id" column="Id" type="Int32" unsaved-value="any">
<generator class="hilo"/>
</id>
<map name="EntityCollection" table="CaseEntityRoles"
cascade="save-update" lazy="false" inverse="false">
<key column="CaseId" />
<index-many-to-many class="Entity"
column="EntityId" />
<element column="Roles" type="Roles" not-null="true" />
</map>
</class>
和
<class name="Entity" table="[Entity]">
<id name="Id" column="Id" type="Int32" unsaved-value="0">
<generator class="hilo"/>
</id>
</class>
测试代码示例:
[Test]
public void Can_add_new_case()
{
var newCase = new Case();
newCase.EntityCollection.Add(new Entity(), Roles.Role1);
newCase.EntityCollection.Add(new Entity(), Roles.Role2);
/* At which point I try to persist newCase and get an exception */
}
在测试代码中,newCase-instance 是持久的,但新实体不是。我尝试了很多不同的事情,比如向version
Entity 添加 < > 标记并搞乱未保存的值,但似乎没有任何帮助。正如您从映射中看到的那样,我确实有 cascade="save-update"。有任何想法吗?