0

Je récupère une entité avec un identificateur Guid à partir d'une base de données ... et je dois enregistrer l'entité dans une autre base de données et conserver le même identificateur Guid.Now, NHibernate génère un nouveau Guid chaque fois que j'effectue une opération de sauvegarde, et c'est normal, parce que j'ai configuré le fichier de mappage pour l'entité de cette manière. Est-il possible que je puisse modifier le mappage de mon cas d'utilisation lors de l'exécution?Modification du mappage du modèle NHibernate au moment de l'exécution

Voici comment je définis mon mapping pour ID, et je veux le garder comme ça, si c'est possible.

public class OrderMap : ClassMap<Order> 
{ 
    public OrderMap() 
    { 
     Table("t_Order"); 
     Id(o => o.Id).GeneratedBy.GuidComb(); 
     ..... 
     ..... 
     ..... 
    } 
} 

Et voici comment j'essaie de changer à IdentifierStrategyGenerator, mais sans effet, NHibernate attribue un nouveau GUID pour chaque opération de sauvegarde, et je suis perdre l'identifiant souhaité.

private void UpdateClientDatabase() 
    { 
     var key = HibernateMultipleDatabasesManager.Configuration 
                .GetClassMapping(typeof(Order)).Key as NHibernate.Mapping.SimpleValue; 

     key.IdentifierGeneratorStrategy = "assigned"; 
     key.NullValue = "undefined"; 

     using (var session = HibernateMultipleDatabasesManager.DataSessionFactory("SQLiteDatabase").OpenSession()) 
     { 
      _downloadedOrders.OfType<Order>().ForEach(_ => session.Save(_)); 
     } 
    } 
+1

Je sais que c'est un peu plus de travail, mais vous pouvez créer 2 usines de session avec les différents mappages. – Fran

+0

D'accord avec @Fran. Vous pouvez alors injecter la session de votre choix au moment de l'exécution. –

Répondre

0

Vous pouvez directement écrire une instruction SQL en tant qu'exception. La copie d'une entité dans une autre base de données me semble être une exception. Pour un exemple, voir this answer.

Session.GetISession().CreateSQLQuery("insert ....").ExecuteUpdate();