通过代码在 Nhibernate 映射中从单个 class 映射生成多个物理 table

Generate mutiple physical table from single class Map in Nhibernate mapping by code

我有一个 ClassMapping,我想生成多个编译时未知的物理表。例如,我想使用单个 class 映射中的 Table1、Table2、Table3 等。

我尝试了下面的代码,但是模型映射器只添加了一个 class 地图并且它再次更新了之前的 class 地图。不添加另一个 class 地图。

private static ISessionFactory CreateSessionFactory()
    {
        var cfg = new Configuration();
        cfg.CurrentSessionContext<ThreadStaticSessionContext>();
        cfg.Configure();
        var mapper = new ModelMapper();
        mapper.AddMappings(typeof(ClientMap).Assembly.GetTypes());
        AddDynamicTables(mapper);
        cfg.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
        BuildSchema(cfg);
        return cfg.BuildSessionFactory();
    }

private static void AddDynamicTables(ModelMapper mapper)
    {
        var clients = new List<string>() { "First", "Second" };
        foreach (var client in clients)
        {
            var map = new ClassMapping<Rule>();
            map.EntityName("tbl_" + client + "_rules");
            map.Id(x => x.Id);
            map.Property(x => x.RuleId);
            map.Property(x => x.ShortName);
            map.Property(x => x.IsActive);
            map.Property(x => x.Description);
            map.Property(x => x.Type);
            map.Property(x => x.RuleGroup);
            map.Table("tbl_" + client + "_rules");
            mapper.AddMapping(map);
        }
    }

我认为这是因为 customizerHolder 中的 Merge。如何从单个 class 映射创建可变数量的表?

我能够通过在 foreach 中创建不同的新模型映射器从同一个映射创建多个表,为每个表使用编译映射并添加到配置中。

private static void AddDynamicTables(Configuration cfg)
    {
        var clients = new List<string>() { "First", "Second" };
        foreach (var client in clients)
        {
            var mapper = new ModelMapper();
            var map = new ClassMapping<Rule>();
            map.EntityName("tbl_" + client + "_rules");
            map.Property(x=>x.RuleId);
            map.Table("tbl_" + client + "_rules");
            mapper.AddMapping(map);
            var mappings = mapper.CompileMappingForAllExplicitlyAddedEntities();
            cfg.AddMapping(mappings);
        }
    }