Create Database and Tables with NHibernate and FluentNHibernate?

匆匆过客 提交于 2019-12-24 17:44:16

问题


I'm looking for any way to create database and tables with NHibernate and FluentNHibernate.

How could I do this ?

trying.

private static ISessionFactory createConnection()
{
    if (session != null)
        return session;

    //database configs
    FluentConfiguration _config = Fluently.Configure().Database(
        MySQLConfiguration.Standard.ConnectionString(
            x => x.Server(HOST).
            Username(USER).
            Password(PASSWORD).
            Database(DB)
        ))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<PerfilMap>())
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ModuloMap>())
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<PermissaoMap>())
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UsuarioMap>())
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<CategoriaMap>())
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SubcategoriaMap>    ())
        .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true));

    session = _config.BuildSessionFactory();
    return session;
}

回答1:


Neither NHibernate nor FNH create the database itself. You have to provide either code or a precreated database yourself. But it can create the tables for you. The class doing this is call SchemaExport. In Fluent, it looks like this:

var sessionFactory = Fluently.Configure()
   .Database(/* ... */)
   .Mappings(/* ... */)
   .ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false))
   .BuildSessionFactory();

Shamelessly copied from this SO question.




回答2:


One full implementation could be:

For one entity class like Genre there will be a mapping class like GenreMap. And a general nhibernate helper class to get a session to db(SessionFactory) class for mapping all entities to database:

public class Genre
{
    public virtual int GenreId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
}

public class GenreMap : ClassMap<Genre>
{
    public GenreMap()
    {
        Id(x => x.GenreId).Column("Id");
        Map(x => x.Name);
        Map(x => x.Description);
        Table("Genres");
    }
}

and finally in SessionFactory class:

public static class SessionFactory
{
    private static ISessionFactory _factory;

    public static ISession OpenSession()
    {
        return _factory.OpenSession();
    }

    public static void Init(string connectionString)
    {
        _factory = BuildSessionFactory(connectionString);
    }

    private static ISessionFactory BuildSessionFactory(string connectionString)
    {
        ISessionFactory sessionFactory = Fluently
            .Configure()
            .Database(PostgreSQLConfiguration.PostgreSQL81
                .ConnectionString(c => c.Is(connectionString))
                .ShowSql())

            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<GenreMap>())
            .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))
            .BuildSessionFactory();

        return sessionFactory.OpenSession();
    }
}

And the usage will be like:

public ActionResult Index()
{
    using (ISession session = SessionFactory.OpenSession())
    {
        var persons = session.Query<Genre>().ToList();

        return View(persons);
    }
}

And in Startup class:

SessionFactory.Init(connectionString);


来源:https://stackoverflow.com/questions/36048280/create-database-and-tables-with-nhibernate-and-fluentnhibernate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!