Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Gerar novas tabelas pelo NHibernate sem perder os dados

Boa tarde,

Eu tenho uma dúvida em relação ao uso do NHibernate (C#): é possível ao adicionar novas Entidades + Mapeamentos e, ao chamar o Método de Geração dos Schemas sem perder os dados anteriormente adicionados nas Tabelas!?

Abaixo, não sei se torna-se necessário, seguem meus Fontes envolvidos:

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
    <property name="connection.connection_string">
      Server=localhost;Database=DB_NHIBERNATE;Uid=root;Pwd=123456;
    </property>

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="cache.use_second_level_cache">true</property>
    <property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property>
    <property name="cache.use_query_cache">true</property>
  </session-factory>
</hibernate-configuration>

Abaixo, Fonte da Classe NHibernateHelper:

using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace prjNHibernate_Caelum.Infra {
    public class NHibernateHelper {

        public static ISessionFactory sessionFactory = CriaSessionFactory();
        public static ISessionFactory CriaSessionFactory() {
            Configuration cfg = RecuperaConfiguracao();
            return cfg.BuildSessionFactory();
        }
        public static Configuration RecuperaConfiguracao() {
            Configuration cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(Assembly.GetExecutingAssembly());

            return cfg;
        }
        public static void GeraSchema() {
            Configuration cfg = RecuperaConfiguracao();
            new SchemaExport(cfg).Create(true, true);
        }
        public static ISession AbreSession() {
            return sessionFactory.OpenSession();
        }
    }
}

Desde já obrigado, abraços.

6 respostas

Olá Adriano,

no xml adicione esta propriedade e veja se funciona

<property name="hbm2ddl.auto">update</property>

Farei o teste em breve e comento aqui.

Obrigado.

Eu utilizei a propriedade que me passou, contudo mesmo assim os dados são perdidos.

Estou fazendo uma busca pela internet, caso encontre algo também publicarei aqui.

Obrigado!

Ainda não consegui achar uma forma de gerar as Tabelas pelo NHibernate sem a exclusão dos dados (na existência das tabelas, anteriores).

Alguém conseguiria ajudar no cenário!?

Abs.

Olá Adriano,

na verdade quem está causando a remoção dos dados do banco é o

new SchemaExport(cfg).Create(true, true);

Você pode tirar isso e no lugar colocar

SchemaUpdate(cfg).Execute(true,true)

que ai sim ele deve fazer só o update na base sem apagar os dados anteriores.

solução!

Boa tarde,

Funcionou o código com a alteração recomendada.

Muito obrigado!!

Abs.