NHibernateは、省エネたIDictionary:TransientObjectException
-
12-09-2019 - |
質問
私のクラスの場合、私は、値としてキーと役割(列挙型)としてエンティティとのIDictionary(クラス)を持っています。 IDictionaryを、エンティティの新しいインスタンスで満たされている場合の新しいインスタンスを(非永続)、保存しようとするとき、私は次のエラーを取得:
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 */
}
はtestcodeでnewCase-インスタンスが永続化されているが、新しいエンティティはありません。私は、エンティティに<version
>タグを追加し、保存されていない値をいじりのように、異なる多くのことを試してみたが、何も助けていないようにみえます。そして、あなたは、私は=「セーブ・アップデート」のカスケードを持っているマッピングから見ることができるように。
任意のアイデア?
解決
私はあなたがケースを保持しようとする前に、まずケースによって参照されるエンティティオブジェクトを永続化する必要があると思います。私はこの方法で解決し、同様の問題がありました。例えば、RhinoのNHRepositoryを使用します:
[Test]
public void Can_add_new_case()
{
var newCase = new Case();
var entity1 = new Entity();
var entity2 = new Entity();
newCase.EntityCollection.Add(entity1, Roles.Role1);
newCase.EntityCollection.Add(entity2, Roles.Role2);
Rhino.Commons.NHRepository<Entity> entityRepository = new NHRepository<Entity>();
Rhino.Commons.NHRepository<Case> caseRepository = new NHRepository<Case>();
using (UnitOfWork.Start())
{
entityRepository.SaveOrUpdate(entity1);
entityRepository.SaveOrUpdate(entity2);
caseRepository.SaveOrUpdate(newCase);
}
}
他のヒント
あなたがtrueに逆を設定した場合はどうなりますか?
私は、これはあなたの問題を解決ウィルかどうか知らない...
あなたは何ができるか、リポジトリパターンを利用して、そして「CaseRepository」クラスを作成することです。 そのリポジトリでは、与えられたケースを保存しますSaveメソッドを持っています。 その保存方法では、特定のケースのためのすべてのエンティティをループし、明示的には、各エンティティの「するsaveOrUpdate」を呼び出すことができます。
私はまた、あなたがこの問題のために辞書を使用している理由だろうか?