son - Luchando por comprender nHibernate SchemaUpdate, incluso con publicaciones de blog
etiquetas para blog personal (1)
Tu ejemplo funciona bien para mí (NH3.1, FNH 2.1). SchemaUpdater comprueba el esquema actual de la base de datos y crea secuencias de comandos alternativas correctas. Todos los fragmentos de scripts generados están expuestos a UpdateSchema. No hay problema aqui El único detalle que me confundió es el acceso al modo de archivo:
- Primer mapa ejecutado: El script de esquema de base de datos completo se almacena en el archivo update.sql. Tenga en cuenta que allí el script aún no se ejecuta, porque el parámetro doUpdate es falso:
SchemaUpdater.Execute(updateExport, false);
- Ejecute manualmente el archivo update.sql: se crea el esquema de la base de datos.
- Cambio en el mapeo FNH (por ejemplo, se agrega una propiedad).
- Segundo recorrido del mapa: el script Corretct alter table se anexa al archivo update.sql.
Tal vez sería mejor eliminar el archivo de salida antes de la actualización del esquema.
El script generado se puede ejecutar automáticamente (el parámetro doUpdate es verdadero):
SchemaUpdater.Execute(updateExport, true);
No sé si es tu caso, pero ahora estoy contento. Tu fragmento de código resolvió algunos de mis problemas. Gracias por la inspiración :).
He visto las diversas publicaciones del blog sobre SchemaUpdate de SchemaUpdate
, e incluso Ayende''s
muy buen ejemplo de Ayende''s
, y descargué las muestras, pero por alguna razón no puedo hacer que funcione lo mismo para mí. Notaré que estoy usando Fluent NHibernate
, pero por lo que puedo decir, eso no debería marcar una gran diferencia.
Actualizar
Llegué al punto donde se ejecuta
SchemaUpdate
, pero es solo una creación de esquema completo, no ''alteración''. En otras palabras, es lo mismo que si acabara de construir la base de datos fresca. Estoy publicando mi fuente completa a continuación.
Esto es básicamente lo que intento ... Creo que, en general, es obvio, pero básicamente estoy creando un objeto de Configuration
usando la Configuración Fluent, y luego tratando de pasarlo. Las pruebas unitarias pasan, los programas se ejecutan ... pero nada en realidad sucede. Nunca puedo ver ningún resultado, y nunca puedo ver el esquema de base de datos actualizado.
La base de datos se crea (columnas faltantes, etc.)
La base de datos luego se asigna con un nuevo esquema en la próxima ejecución.
La base de datos (actualización) debe actualizar el esquema según el método de actualización.
Pero eso no es lo que realmente está sucediendo.
También miré otras publicaciones sobre el tema. Me gusta aquí: http://morten.lyhr.dk/2008/03/nhibernates-schemaupdate-feature.html
Además, he cambiado mi código después de encontrar la siguiente publicación de Stack Overflow Hacer que el archivo de salida de NHibernate sea actualizado al archivo
E incluso con el código de muestra no fue posible hacer cara o cruz de esta característica.
Código
private static void UpdateSchema(NHibernate.Cfg.Configuration Config) {
System.Action<string> updateExport = x => {
using (var file = new System.IO.FileStream(@"C:/Users/User/Documents/Visual Studio 2010/Mappings/update.sql", System.IO.FileMode.Append, System.IO.FileAccess.Write))
using (var sw = new System.IO.StreamWriter(file)) {
sw.Write(x);
sw.Close();
}
};
NHibernate.Tool.hbm2ddl.SchemaUpdate SchemaUpdater = new NHibernate.Tool.hbm2ddl.SchemaUpdate(Config);
SchemaUpdater.Execute(updateExport, false);
}
public static ISessionFactory Map(string connectionString) {
// fluently configure an ms-sql 2008 database
return FluentNHibernate.Cfg.Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.Is(connectionString))
.AdoNetBatchSize(50)
.FormatSql()
.UseReflectionOptimizer())
.Cache(c => c
.ProviderClass<NHibernate.Caches.SysCache2.SysCacheProvider>()
.UseQueryCache()
.UseSecondLevelCache()
.UseMinimalPuts())
.Mappings(m => {
m.FluentMappings.Conventions.Setup(x => {
x.AddFromAssemblyOf<Mappings.AspectMap>();
x.Add<EnumConvention>();
x.Add(FluentNHibernate.Conventions.Helpers.AutoImport.Never());
});
m.FluentMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
})
.ExposeConfiguration(UpdateSchema)
.BuildSessionFactory();
}