2008-10-05 14 views
5

Me enamoré de NHibernate y la fluida interfaz. Este último permite mapeos muy agradables con soporte de refactorización (no más necesidad de archivos xml).Combinar fluidez y mapeo XML para NHibnernate

Pero nadie es perfecto, por lo que me falta el mapeo de muchos a ninguno con fluidez. ¿Alguien sabe si ya está allí? Si es así, una simple línea de código sería agradable.

Pero para seguir con el encabezado de la pregunta, ¿hay alguna manera de combinar la correspondencia de NHibernate con fluidez y normal.

Actualmente utilizo las siguientes líneas para mi configuración de prueba CON fluidez, y el segundo bloque de código para mi prueba SIN fluidez (con asignaciones de XML). ¿Cómo puedo saber fluidez a utilizar con fluidez si está disponible y XML de otro modo ...

 var cfg = new Configuration(); 
     cfg.AddProperties(MsSqlConfiguration.MsSql2005.ConnectionString.Is(_testConnectionstring).ToProperties()); 
     cfg.AddMappingsFromAssembly(typeof(CatMap).Assembly); 
     new SchemaExport(cfg).Create(true, true); 

     var persistenceModel = new PersistenceModel(); 
     persistenceModel.addMappingsFromAssembly(typeof(CatMap).Assembly); 
     IDictionary<string, string> properties = MsSqlConfiguration.MsSql2005.UseOuterJoin().ShowSql().ConnectionString.Is(_testConnectionstring).ToProperties(); 
     properties.Add("command_timeout", "340"); 

     session = new SessionSource(properties, persistenceModel).CreateSession(); 

Sin Fluido ...

 config = new Configuration(); 
     IDictionary props = new Hashtable(); 

     props["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider"; 
     props["dialect"] = "NHibernate.Dialect.MsSql2005Dialect"; 
     props["connection.driver_class"] = "NHibernate.Driver.SqlClientDriver"; 
     props["connection.connection_string"] = "Server=localhost;initial catalog=Debug;Integrated Security=SSPI"; 
     props["show_sql"] = "true"; 
     foreach (DictionaryEntry de in props) 
     { 
      config.SetProperty(de.Key.ToString(), de.Value.ToString()); 
     } 
     config.AddAssembly(typeof(CatMap).Assembly); 

     SchemaExport se = new SchemaExport(config); 
     se.Create(true, true); 

     factory = config.BuildSessionFactory(); 
     session = factory.OpenSession(); 

Eso es todo ... Chris

PS: Realmente como este sitio, la GUI es perfecta, y la calidad de todos los artículos es increíble. Creo que va a ser enorme :-) tiene que registrarse ...

Respuesta

2

Mapeo de Foo a Baa:

HasManyToMany<Baa> (x => Baas) 
    .AsBag () //can also be .AsSet() 
    .WithTableName ("foobar") 
    .WithParentKeyColumn ("fooId") 
    .WithChildKeyColumn ("barId") ; 

Salida los ejemplos de ClassMapXmlCreationTester - también muestran lo que los nombres de columna por defecto son.

2

Actualmente, ManyToAny no está implementado (en el momento de la redacción).

En cuanto a su configuración para mapeos fluidos y no fluidos, casi está allí con su primer ejemplo.

var cfg = MsSqlConfiguration.MsSql2005 
    .ConnectionString.Is(_testConnectionstring) 
    .ConfigureProperties(new Configuration()); 

cfg.AddMappingsFromAssembly(typeof(CatMap).Assembly); // loads hbm.xml files 

var model = new PersistenceModel(); 
model.addMappingsFromAssembly(typeof(CatMap).Assembly); // loads fluent mappings 
mode.Configure(cfg); 

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

La principal diferencia es que el SchemaExport es el último. Supongo que su primer ejemplo fue en realidad cargar las asignaciones con fluidez, pero ya había creado el esquema en ese punto.

2

Puedes hacer exactamente lo que quieras hacer completamente dentro de Fluent NHibernate.

El siguiente código usará sintaxis fluida de NHibernate para configurar con fluidez una fábrica de sesiones que busque archivos de mapeo HBM (xml), asignaciones fluidas y convenciones de múltiples conjuntos posibles.

var _mappingAssemblies = new Assembly[] { typeof(CatMap).Assembly }; 
var _autoPersistenceModel = CreateAutoPersistenceModel(); 
Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2005.ConnectionString(_testConnectionstring)) 
     .Mappings(m => 
        { 
         foreach (var assembly in _mappingAssemblies) 
         { 
          m.HbmMappings.AddFromAssembly(assembly); 
          m.FluentMappings.AddFromAssembly(assembly) 
           .Conventions.AddAssembly(assembly); 
         } 
         m.AutoMappings.Add(_autoPersistenceModel); 
        }) 
     .ExposeConfiguration(c => c.SetProperty("command_timeout", "340")) 
     .BuildSessionFactory(); 

Hay muchas otras opciones disponibles para usted, así: Fluent NHibernate Database Configuration

Cuestiones relacionadas