【问题标题】:Building Fluent NHibernate Maps at runtime在运行时构建 Fluent NHibernate Maps
【发布时间】:2015-02-20 17:46:58
【问题描述】:

我正在做一个查看 Mirth Connect v3 创建的数据库的项目。

在此版本中,表是在运行时根据创建的通道创建的。

例如,如果我创建一个新频道,它会在具有唯一 ID 的表中创建一个条目。然后,使用该 ID 创建一组表,并将该 ID 添加到名称的末尾。即,对于 id 为 8 的频道,会创建一个名为 d_ms8(以及其他)的表。

所有这些表 (d_ms*) 都具有相同的结构。

我想知道是否有办法在 Fluent NHibernate 中映射这种事情。

    public class MapChannelStats : ClassMap<ChannelStatsObj>
{
    public const String TableName = "d_ms8";

    public MapChannelStats()
    {
        Table(TableName);

        Id(x => x.MetadataID).Column("metadata_id");
        Map(x => x.ServerID).Column("server_id");
        Map(x => x.Errored).Column("error");
        Map(x => x.ErroredLifetime).Column("error_lifetime");
        Map(x => x.Filtered).Column("filtered");
        Map(x => x.FilteredLifetime).Column("filtered_lifetime");
        Map(x => x.Received).Column("received");
        Map(x => x.ReceivedLifetime).Column("received_lifetime");
        Map(x => x.Sent).Column("sent");
        Map(x => x.SentLifetime).Column("sent_lifetime");
    }
}

谢谢,

布鲁斯。

【问题讨论】:

    标签: fluent-nhibernate connect mirth


    【解决方案1】:

    您要问的是一件困难的事情,因为我认为您无法在运行时更改表的名称。但是,如果您改变方法,应该有一些可能性,例如:

    • 您可以创建一列来指定租户 ID,而不是为其创建整个表。然后,您可以专门为此列设置一个过滤器 (reference),您可以这样更改:

      Session.EnableFilter("tenant-filter").SetParameter("TenantId", "2");
      
    • 或者您可以为哪个租户创建一个数据库,并使用像Boot.Multitenancy 这样的组件。

    【讨论】:

    • 你好大卫。谢谢,但不幸的是,这是一个我无法控制的数据库。这就是为什么它是一种痛苦。
    • 我怀疑我将不得不为此部分使用另一种技术。可能是 LINQ。
    • 我明白了。在这种情况下,我认为您可能必须使用纯 SQL 查询。
    • 谢谢大卫。这正是我所做的。
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2011-03-31
    • 2022-09-23
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多