我不知道这一般是NHibernate,还是流利的......基本上我是想让它根据映射创建一个数据库。
最初,我尝试了一个Postgres连接,但是没有用,所以我想我会切换到内存中的SQLite,但这也不起作用。
我认为我对如何使这项工作或其工作的假设存在根本性的错误。
这是代码......
if (_sessionFactory == null)
{
FluentConfiguration configuration;
var rawConfig = new NHibernate.Cfg.Configuration();
configuration = Fluently.Configure(rawConfig)
.Database(SQLiteConfiguration.Standard.InMemory())
.Cache(c => c.ProviderClass<SysCacheProvider>().UseSecondLevelCache())
.ExposeConfiguration(cfg =>
{
cfg.SetProperty("current_session_context_class", "web");
cfg.AddMapping(MapIdentityModels());
var schema = new SchemaUpdate(cfg);
schema.Execute(true, true);
});
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
private static HbmMapping MapIdentityModels()
{
var baseEntityToIgnore = new[] {
typeof(NHibernate.AspNet.Identity.DomainModel.EntityWithTypedId<int>),
typeof(NHibernate.AspNet.Identity.DomainModel.EntityWithTypedId<string>),
};
var allEntities = new[] {
typeof(IdentityUser),
typeof(ApplicationUser),
typeof(IdentityRole),
typeof(IdentityUserLogin),
typeof(IdentityUserClaim),
};
var mapper = new ConventionModelMapper();
DefineBaseClass(mapper, baseEntityToIgnore);
mapper.IsComponent((type, declared) => typeof(NHibernate.AspNet.Identity.DomainModel.ValueObject).IsAssignableFrom(type));
mapper.AddMapping<IdentityUserMap>();
mapper.AddMapping<IdentityRoleMap>();
mapper.AddMapping<IdentityUserClaimMap>();
return mapper.CompileMappingFor(allEntities);
}
private static void DefineBaseClass(ConventionModelMapper mapper, System.Type[] baseEntityToIgnore)
{
if (baseEntityToIgnore == null) return;
mapper.IsEntity((type, declared) =>
baseEntityToIgnore.Any(x => x.IsAssignableFrom(type)) &&
!baseEntityToIgnore.Any(x => x == type) &&
!type.IsInterface);
mapper.IsRootEntity((type, declared) => baseEntityToIgnore.Any(x => x == type.BaseType));
}
当有任何人试图使用它不存在的数据库或者表中不存在该表时,我收到一条错误消息。
我的目标是让代码在首次运行时在Postgres数据库中创建表。
更新
我已设法通过更改行
来解决此问题 cfg.AddMapping(MapIdentityModels())
到
cfg.AddDeserializedMapping(MapIdentityModels())
不确定原因,但是这有效,如果有人可以解释原因,并且可能如何在不使用ExposeConfiguration
路线的情况下实现相同的结果,那么我会将其标记为答案。
答案 0 :(得分:0)
似乎问题与未正确添加的映射有关,因此它可能正在尝试创建它,但没有任何映射可以创建。
要修复它,我使用以下方法添加了映射:
cfg.AddDeserializedMapping(MapIdentityModels())