-->

Generate XML mappings from fluent Nhibernate

2019-01-07 18:10发布

问题:

How do I generate xml mappings files as part of my tests in MappingIntegrationTests

I need to manually check if the fluent mappings correlate to the mappings in the leagcy project.

回答1:

You can do something like:

 config.Mappings(m => 
    {
        m.FluentMappings.ExportTo("...file path here...");
        m.HbmMappings.ExportTo("...file path here...");
        m.AutoMappings.ExportTo("...file path here...");
    {
);

I don't like it myself. If I find some better way (if such exists at all) I'll update the answer.

See
http://blog.jagregory.com/2009/02/03/fluent-nhibernate-configuring-your-application/
Or if broken, see this instead
https://github.com/jagregory/fluent-nhibernate/wiki/Database-configuration



回答2:

You generate XML mappings by calling the ExportTo() method.

For example:

ISessionFactory sessionFactory = FluentNHibernate.Cfg.Fluently.Configure()
  .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
    .ConnectionString(connectionString)
  )
  .Mappings(m => m.FluentMappings.AddFromAssembly(assembly)
    .ExportTo(@"C:\your\export\path")
  )
  .BuildSessionFactory();

See here for documentation:

http://wiki.fluentnhibernate.org/Fluent_configuration



回答3:

I use (almost) this extension method to get the xbm in memory so I can view it in my test project:

   public static IDictionary<string, string> LoadHBM(this FluentConfiguration cfg)
    {
        var result = new Dictionary<string, string>();
        var mem = new MemoryStream();
        var writer = new StreamWriter(mem);
        var reader = new StreamReader(mem);

        cfg.Mappings(x =>
        {
            x.FluentMappings.ExportTo(writer);
            x.AutoMappings.ExportTo(writer);
        });

        cfg.BuildConfiguration();
        writer.Flush();
        mem.Seek(0, 0);
        var hbm = reader.ReadToEnd();

        var objects = XElement.Parse("<junk>" + hbm + "</junk>").Elements();
        objects.ToList().ForEach(x => result.Add(x.Elements().First().Attribute("name").Value, x.ToString()));
        return result;
    }

Edit: Updated for FNH 1.2.