NHibernate(Fluent)没有创建数据库

时间:2014-04-19 19:15:18

标签: sqlite postgresql nhibernate fluent-nhibernate

我不知道这一般是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路线的情况下实现相同的结果,那么我会将其标记为答案。

1 个答案:

答案 0 :(得分:0)

似乎问题与未正确添加的映射有关,因此它可能正在尝试创建它,但没有任何映射可以创建。

要修复它,我使用以下方法添加了映射:

cfg.AddDeserializedMapping(MapIdentityModels())