NHibernate SaveOrUpdate Enfant Collection Pas Mis À Jour Avec L'Identité Id

Je suis clairement en manque de quelque chose (j'espère évident), et j'ai pas eu de chance avec Google à ce jour.

J'ai une relation Parent-Enfant assignés comme suit

Simplifié De La Carte Mère

  public sealed class ParentMap : ClassMap<ParentEntity>
  {
    public ParentMap()
    {
      Table("Parent");
      Component(x => x.Thumbprint);
      Id(x => x.Id).GeneratedBy.Identity();

      Map(x => x.ServeralNotNullableProperties).Not.Nullable();

      HasMany(x => x.Children).KeyColumn("ChildId")
                              .Inverse()
                              .LazyLoad()
                              .Cascade
                              .AllDeleteOrphan();

      References(x => x.SomeUnrelatedLookupColumn).Column("LookupColumnId").Not.Nullable();
    }
  }

Simplifié Enfant Carte

  public sealed class ChildMap : ClassMap<ChildEntity>
  {
    public ChildMap()
    {
      Table("Child");
      Component(x => x.Thumbprint);
      Id(x => x.Id).GeneratedBy.Identity();

      Map(x => x.MoreNotNullableProperties).Not.Nullable();

      References(x => x.Parent).Column("ParentId").Not.Nullable();
    }
  }

De Services Simplifiée Des Étapes De Méthode

J'ai ensuite une méthode de service qui récupère Parent et ajoute une nouvelle Enfant par le biais de certaines méthode de domaine. Le sous-jacent NHibernate code se résume à:

1) Session Ouverte sur WCF AfterReceiveRequest (IDispatchMessageInspector)

_sessionFactory.OpenSession();

2) Récupérer l'instance existante de parent via .Requête

_session.Query<ParentEntity>()
        .Where(item => item.Id == parentId)
        .Fetch(item => item.SomeLookupColumn)
        .First();

3) Ajouter une nouvelle "Enfant" entité "Mère" par domaine de méthode de l'objet comme...

public ChildEntity CreateChild()
{
  var child = new ChildEntity{ Parent = this };

  Children.Add(child);

  return child;
}

4) Finalement, les appels SaveOrUpdate sur "Parent" de l'entité.

 //ChildEntity Id is 0
 _session.SaveOrUpdate(parentEntity)
 //Expect ChildEntity Id to NOT be 0

Remarque: l'Utilisation de SaveOrUpdate Ne conserver des modifications apportées à la base de données; l'utilisation de Fusionner les résultats dans TransientObjectException mentionnés ci-dessous.

5) Enfin, la transaction validée sur WCF BeforeSendReply (IDispatchMessageInspector)

 _session.Commit();

Le Problème

En général, lorsqu'une entité est enregistrée, après l'appel à SaveOrUpdate, l'Identifiant de cette entité refects l'Identité générée par l'instruction INSERT. Cependant, lorsque j'ajoute une nouvelle entité enfant à un parent, l'entité associée dans Children n'est pas assigné un numéro d'identification. J'ai besoin de passer cet Id à l'appelant ainsi les appels suivants résultat des MISES à jour et pas des INSERTS supplémentaires.

Pourquoi est NHibernate pas la mise à jour de l'entité sous-jacente?
Je ne explicitement appel SaveOrUpdate sur l'enfant (qui suce si c'est le cas)?

Toute réflexion sur la question grandement apprécié. Merci!

MODIFIER
Je tiens à souligner, que la nouvelle entité enfant EST enregistré comme prévu; je n'arrive pas à récupérer l'Id affecté.

Mise à JOUR
Essayé de commutation .De fusion(~) comme suggéré par Michael Buen ci-dessous; résultant en une TransientObjectException de me dire pour enregistrer explicitement modifié mon enfant entité avant l'appel à la fusion. J'ai également expérimenté avec .Persist(~) en vain. Toute autre vision grandement apprécié.

objet est sauvegardé transitoire exemple - pour enregistrer l'instance transitoire avant la fusion: Mon.Espace de noms.ChildEntity

Vous ne savez pas si cela aide, mais SaveOrUpdate a été dépréciée en faveur de l'Ajouter (j'ai aimé le nom SaveOrUpdate mieux, mais c'est ce que c'est)

OriginalL'auteur Chris Baxter | 2011-04-12