2009-12-17 7 views
2

Je suis assez nouveau à nHibernate, donc ce sera probablement une question assez stupide. Mais de toute façon, enregistrer un objet fonctionne bien, la mise à jour ne fonctionne pas.Mise à jour d'un objet dans nHibernate

C'est ce que je fais:

using (ISession session = _sessionFactory.OpenSession()) 
{ 
    session.SaveOrUpdate(schemaChange); 
    schemaChange.ScriptName = "New one"; 
    session.SaveOrUpdate(schemaChange); 
} 

Le premier saveOrUpdate insère une schemaChange dans la base de données. Le second devrait mettre à jour le même objet, mais nHibernate ne le fait pas.

Dans la sortie I get:

DEBUG - instance persistante de: DotNetMigrations.Core.Domain.SchemaChange

DEBUG - ignorant instance persistante

DEBUG - objet déjà associé à la session: [DotNetMigrations .Core.Domain.SchemaChange # 129]

MISE à JOUR

Eh bien, il était si simple (et question stupide), je l'ai trouvé moi-même:

session.SaveOrUpdate(schemaChange); 
schemaChange.ScriptName = "New one"; 
session.Flush(); 

Makes sence. nHibernate est vraiment supérieur à n'importe quel outil orm avec lequel j'ai travaillé. Ce que je n'arrive pas à comprendre, c'est pourquoi il existe une méthode SaveOrUpdate ... Si vous mettez à jour, l'objet n'est-il pas automatiquement associé à la session? (parce que vous l'avez sorti de la base de données en premier, sauf si vous l'avez envoyé par exemple à un Flex RIA et il est revenu)

Alors, comment savez-vous si l'objet est déjà associé, soit faire un SaveOrUpdate() ou juste un Flush()?

+0

Vous auriez pu répondre automatiquement à votre question et gagner un badge ici ... ^^ – Romain

+0

Ouais, ça aurait rendu ma vie digne d'être vécue ;-) –

Répondre

2

Vous pouvez utiliser la méthode Session.Contains (objet) pour comprendre cela. La différence entre Save() et Update() est que Save attribue un Id si nécessaire, si Update() échoue si l'objet n'a pas de clé ou si la clé n'existe pas dans la base de données. SaveOrUpdate corrige quelques problèmes concernant le travail avec des objets transitoires, si vous ne vous souciez pas de l'état de l'objet, vous pouvez l'appeler, mais ce n'est pas du tout le Saint Graal. Si vous connaissez l'état de l'objet, je suggère d'appeler la méthode exacte.

Espérons que cela aide un peu à clarifier.

Questions connexes