FluentNHibernate-将类映射到多个表

FluentNHibernate-将类映射到多个表,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,对不起,我的问题太长了。但是所有的细节都值得一提,所以请耐心听我讲到最后 我正在处理一个我没有太多控制权的遗留数据库。我希望能够将一个类映射到多个数据库表。这是我的桌子的样子 查找 +--------+--------------+------------+ | Column | DataType | Attributes | +--------+--------------+------------+ | Id | INT | PK | | C

对不起,我的问题太长了。但是所有的细节都值得一提,所以请耐心听我讲到最后

我正在处理一个我没有太多控制权的遗留数据库。我希望能够将一个类映射到多个数据库表。这是我的桌子的样子

查找

+--------+--------------+------------+
| Column |   DataType   | Attributes |
+--------+--------------+------------+
| Id     | INT          | PK         |
| Code   | NVARCHAR(50) |            |
+--------+--------------+------------+
文化

+--------------+--------------+------------+
|    Column    |   DataType   | Attributes |
+--------------+--------------+------------+
| Id           | INT          | PK         |
| Culture_Code | NVARCHAR(10) |            |
+--------------+--------------+------------+
Lookup\u t9n

+----------------+---------------+---------------------+
|     Column     |   DataType    |     Attributes      |
+----------------+---------------+---------------------+
| Id             | INT           | PK                  |
| Culture_Id     | INT           | FK to Culture table |
| Localised_Text | NVARCHAR(MAX) |                     |
+----------------+---------------+---------------------+
如您所见,我有一个查找表,其中存储了所有查找。查找的显示文本将本地化并存储在单独的表中。此表具有区域性表的外键,以指示存在本地化文本的区域性

我的班级看起来像这样

public class Lookup {

    public virtual int Id {get; set;}

    public virtual string Code {get; set;}

    public virtual string DisplayText {get; set;}
}
public class LookupMappings : ClassMap<Lookup> {

    public LookupMappings()
    {
        Table("Lookup");
        Id(x => x.Id).Column("Id");
        Map(x => x.Code).Column("Code");

        Join("Lookup_t9n", join => {
            join.Map(x => x.DisplayText).Column("Localised_Text"); //Note this place, my problem is here
        })
    }
}
我的FNH映射类如下所示

public class Lookup {

    public virtual int Id {get; set;}

    public virtual string Code {get; set;}

    public virtual string DisplayText {get; set;}
}
public class LookupMappings : ClassMap<Lookup> {

    public LookupMappings()
    {
        Table("Lookup");
        Id(x => x.Id).Column("Id");
        Map(x => x.Code).Column("Code");

        Join("Lookup_t9n", join => {
            join.Map(x => x.DisplayText).Column("Localised_Text"); //Note this place, my problem is here
        })
    }
}
公共类查找映射:类映射{
公共查找映射()
{
表格(“查阅”);
Id(x=>x.Id)。列(“Id”);
Map(x=>x.Code).Column(“Code”);
Join(“查找”,Join=>{
join.Map(x=>x.DisplayText).Column(“本地化的_-Text”);//注意这里,我的问题就在这里
})
}
}
在上面的映射中,在
Join
部分中,我想提供一些where子句,如
where Lookup\u t9n.Culture\u Id=Culture.Culture\u Id和Culture.Culture\u code=System.Threading.Thread.CurrentUICulture.CultureCode

我知道这不是一个有效的SQL,但表达了我希望的意图。有没有人有做这种事的经验


我可以添加一个映射层,在该层中,我可以让类与数据库表一一映射,然后编写简单的c,将这些类映射回我的
查找
类。我宁愿这样做作为一种临时解决办法。我想知道是否可以通过一些智能的NH使用来删除映射层。

我没有简单的答案,比如
CallThis()
。我想给你一些建议,基于我们如何使用类似的东西。该解决方案基于标准映射,将其复杂性隐藏在C#实体中。这只是解决方案的草案,因此我将跳过中间区域性表,并希望在
Lookup\u t9n
中只存储区域性名称(en,cs…)

我们来上这节课吧

public class Lookup {
    public virtual int Id {get; set;}
    public virtual string Code {get; set;}
                                     // for simplicity skipping null checks    
    public virtual DisplayText { get { return Localizations.First().LocalizedText; } } 
    public virtual IList<Localization> Localizations {get; set;}
}

public class Localization { // mapped to Lookup_t9n
    public virtual string CultureName {get; set;}
    public virtual string LocalizedText {get; set;}
}
收藏:

HasMany(x => x.Localization)
    .KeyColumn("Id")
    ...
    .ApplyFilter<CulturFilter>("CultureName = :culture"))
    .Cascade.AllDeleteOrphan();

现在我们有了基于当前区域性的
本地化
字符串,同时使用本地化值的标准映射作为一个集合。

我已经对您的解决方案进行了两次讨论,试图解决这个问题。我想我需要通过你提供的所有链接,并首先亲自实施。我同意。我的建议不像你希望的那样直截了当。但它在最后起作用了。。。