1

私のクラス Case には、Entity (クラス) をキーとして、Roles (列挙型) を値として持つ 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エンティティに < > タグを追加したり、保存されていない値をいじったりするなど、さまざまなことを試しましたが、何も役に立たないようです。マッピングからわかるように、cascade="save-update" があります。何か案は?

4

2 に答える 2

1

Case を永続化する前に、まず Case によって参照される Entity オブジェクトを永続化する必要があると思います。この方法で解決した同様の問題がありました。たとえば、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);
    }
}
于 2009-08-10T15:20:43.510 に答える
0

inverse を true に設定するとどうなりますか?

これで問題が解決するかどうかはわかりません...

できることは、Repository パターンを利用して、「CaseRepository」クラスを作成することです。そのリポジトリには、特定のケースを保存する Save メソッドがあります。その保存メソッドでは、指定されたケースのすべてのエンティティをループし、エンティティごとに明示的に「SaveOrUpdate」を呼び出すことができます。

また、なぜこの問題で辞書を使用しているのですか?

于 2009-07-09T12:23:31.023 に答える