В моем классе Case У меня есть IDictionary с Entity (класс) в качестве ключа и Роли (enum) как значение. При попытке сохранить новый экземпляр (не сохранилась) в случае, когда IDictionary наполнен новыми экземплярами сущностей я получаю следующее сообщение об ошибке:NHibernate, сохранение IDictionary: TransientObjectException
NHibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing. Type: Entity
Эти классы (Роли является перечисление):
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 */
}
В testcode newCase-экземпляр сохраняется, но новые объекты не являются. Я пробовал много разных вещей, например добавление тега < version
> в Entity и беспорядок с несохраненным значением, но ничего не помогает. И как вы можете видеть из сопоставления, у меня есть cascade = "save-update". Любые идеи?
Да, это в значительной степени то, что я и сделал. Жаль, что он не обрабатывается NHibernate автоматически. Если кто-нибудь знает какие-либо другие решения (или узнайте, когда эта ошибка, если это ошибка, будет исправлена), пожалуйста, сообщите, но до тех пор я предполагаю, что я должен принять это как необходимое решение. – 2009-08-12 08:55:44