使用 NHibernate 和 FluentNHibernate 创建数据库和表?
Create Database and Tables with NHibernate and FluentNHibernate?
我正在寻找使用 NHibernate 和 FluentNHibernate 创建 database
和 tables
的方法。
我该怎么做?
正在尝试。
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;
}
一个完整的实现可以是:
对于一个实体class,如流派,将有一个映射class,如流派映射。和一个通用的 nhibernate 助手 class 获取到 db(SessionFactory) class 的会话,用于将所有实体映射到数据库:
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");
}
}
最后在 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();
}
}
用法如下:
public ActionResult Index()
{
using (ISession session = SessionFactory.OpenSession())
{
var persons = session.Query<Genre>().ToList();
return View(persons);
}
}
并在启动中 class:
SessionFactory.Init(connectionString);
NHibernate 和 FNH 都不会自己创建数据库。您必须自己提供代码或预先创建的数据库。但它可以为您创建表格。 class 这样做是调用 SchemaExport
。在 Fluent 中,它看起来像这样:
var sessionFactory = Fluently.Configure()
.Database(/* ... */)
.Mappings(/* ... */)
.ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false))
.BuildSessionFactory();
无耻地抄袭自this SO question。
我正在寻找使用 NHibernate 和 FluentNHibernate 创建 database
和 tables
的方法。
我该怎么做?
正在尝试。
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;
}
一个完整的实现可以是:
对于一个实体class,如流派,将有一个映射class,如流派映射。和一个通用的 nhibernate 助手 class 获取到 db(SessionFactory) class 的会话,用于将所有实体映射到数据库:
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");
}
}
最后在 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();
}
}
用法如下:
public ActionResult Index()
{
using (ISession session = SessionFactory.OpenSession())
{
var persons = session.Query<Genre>().ToList();
return View(persons);
}
}
并在启动中 class:
SessionFactory.Init(connectionString);
NHibernate 和 FNH 都不会自己创建数据库。您必须自己提供代码或预先创建的数据库。但它可以为您创建表格。 class 这样做是调用 SchemaExport
。在 Fluent 中,它看起来像这样:
var sessionFactory = Fluently.Configure()
.Database(/* ... */)
.Mappings(/* ... */)
.ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false))
.BuildSessionFactory();
无耻地抄袭自this SO question。