2008-10-05 7 views
5

Ich habe mich gerade in NHibernate und die fließende Oberfläche verliebt. Letzteres ermöglicht sehr schöne Mappings mit Refactoring-Unterstützung (keine Notwendigkeit für XML-Dateien mehr).Kombinieren Sie fließende und XML-Zuordnung für NHibnernate

Aber niemand ist perfekt, so fehlt mir das Viele-zu-Ein-Mapping in fließend. Weiß jemand, ob es schon da ist? Wenn ja, wäre eine einfache Codezeile schön.

Aber um am Header der Frage zu bleiben, gibt es eine Möglichkeit, fließende und normale NHibernate Mapping zu kombinieren.

Zur Zeit verwende ich die folgenden Zeilen für meine Testkonfiguration MIT fließend, und den zweiten Codeblock für meinen Test OHNE fließend (mit XML-Mappings). Wie kann ich fließend sagen sonst fließend falls verfügbar und XML verwenden ...

 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(); 

ohne fliessend ...

 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(); 

Das ist es ... Chris

PS: ich wirklich wie diese Seite, ist die GUI perfekt und die Qualität aller Artikel ist unglaublich. Ich denke, es wird sehr groß sein :-) zu registrieren, ...

Antwort

2

Mapping von Foo zu Baa:

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

Sehen Sie sich die Beispiele in ClassMapXmlCreationTester - sie auch zeigen, was die Standardspaltennamen sind.

2

ManyToAny's sind derzeit nicht implementiert (zum Zeitpunkt des Schreibens).

In Bezug auf Ihre Einrichtung für fließende und nicht fließende Zuordnungen sind Sie mit Ihrem ersten Beispiel fast fertig.

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); 

Der Hauptunterschied ist, dass der SchemaExport zuletzt ist. Ich gehe davon aus, dass Ihr erstes Beispiel tatsächlich die flüssigen Zuordnungen geladen hat, aber es hat das Schema bereits erstellt.

2

Sie können genau das tun, was Sie vollständig in Fluent NHibernate tun möchten.

Im folgenden Code wird die Fluent NHibernate-Syntax zum fließenden Konfigurieren einer Sitzungsfactory verwendet, die nach HBM- (XML-) Zuordnungsdateien, flüssigen Zuordnungen und Konventionen von mehreren möglichen Assemblys sucht.

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(); 

Es gibt viele andere Möglichkeiten, die Ihnen auch: Fluent NHibernate Database Configuration