Question

Dans mon cas, de classe, j'ai un IDictionary avec l'entité (une classe) comme la clé et les rôles (un ENUM) en tant que valeur. Lorsque vous essayez d'enregistrer une nouvelle instance (non persisté) de cas où IDictionary est rempli de nouvelles instances de l'entité que j'obtiens l'erreur suivante:

  

NHibernate.TransientObjectException: objet référence une instance transitoire non enregistré - enregistrer l'instance transitoire avant le rinçage. Type: Entité

Ce sont les classes (rôles est un ENUM):

public class Case
{
    public Case { EntityCollection = new Dictionary<Entity, Roles>(); }
    public virtual int Id { get; set; }
    public virtual IDictionary<Entity, Roles> EntityCollection { get; set; }
}

et

public class Entity
{
    public virtual int Id { get; set; }
}

Et la cartographie est la suivante:

<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>

et

<class name="Entity" table="[Entity]">
    <id name="Id" column="Id" type="Int32" unsaved-value="0">
        <generator class="hilo"/>
    </id>
</class>

Echantillon du code de test:

[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 */
}

Dans le TestCode la newCase instance persistée, mais les nouvelles entités ne sont pas. J'ai essayé beaucoup de choses différentes, comme l'ajout d'une balise <version> pour l'entité et de déconner avec unsaved-value, mais rien ne semble aider. Et comme vous pouvez le voir sur la cartographie j'ai cascade = « save-update ». Toutes les idées?

Était-ce utile?

La solution

Je pense que vous devez persister les objets Entity qui sont référencés par le premier cas, avant d'essayer de persister l'affaire. J'ai eu un problème similaire que je résolu de cette façon. Par exemple, en utilisant le 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);
    }
}

Autres conseils

Qu'est-ce qui se passe si vous définissez inverse true?

Je ne sais pas si ce wil résoudre votre problème ...

Qu'est-ce que vous pourriez faire, est de faire usage du modèle référentiel, et de créer une classe « CaseRepository ». Dans ce référentiel, vous aurez une méthode Save qui sauverait un cas donné. Dans cette méthode, vous boucle pourrait sauver plus de toutes les entités de l'affaire donnée et appeler explicitement « saveOrUpdate » pour chaque entité.

Je me demande aussi pourquoi vous utilisez un dictionnaire pour cette question?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top