从查找表返回描述的Fluent NHibernate映射

从查找表返回描述的Fluent NHibernate映射,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我们有以下数据库结构: UserTeam table Id (PK, int not null) UserId (FK, int, not null) TeamId (FK, int, not null) RoleId (FK, int, not null) libRole table Id (PK, int not null) Description (varchar(255), not null) 我们有一个实体,如下所示: public class UserTeam { pub

我们有以下数据库结构:

UserTeam table
Id (PK, int not null)
UserId (FK, int, not null)
TeamId (FK, int, not null)
RoleId (FK, int, not null)

libRole table
Id (PK, int not null)
Description (varchar(255), not null)
我们有一个实体,如下所示:

public class UserTeam
{
    public int Id { get; set; }
    public Team Team { get; set; }
    public User User { get; set; }
    public int RoleId { get; set; }
    public string Role { get; set; }
}
我们正在使用Fluent NHibernate并自动配置NHibernate(即,使用带有覆盖的自动映射类)

我们正试图将libRole表中的description列放入UserTeam表中的“Role”属性中,但确实很困难。以下是我们得到的最接近的结果:

public class UserTeamMap : IAutoMappingOverride<UserTeam>
{
    public void Override( FluentNHibernate.Automapping.AutoMapping<UserTeam> mapping )
    {
        mapping.References( m => m.User ).Column( "UserId" );
        mapping.References( m => m.Team ).Column( "TeamId" );

        mapping.Join("Role", join =>
            {
                join.Fetch.Join();
                join.KeyColumn( "Id" );
                join.Map( x => x.Role, "Description" );
            } );
    }

}
关闭,但NHibernate正在联接中的UserTeam表和libRole表上使用Id列,而它应该在
this_u.RoleId=this_1_u.Id


我们错过了什么?我们并不想在应用程序中创建一个“libRole”实体,因为我们真正关心的是描述值——这是用户可配置的,所以我们也不能只使用枚举。有人能帮忙吗?

Join
使用父表的主键。无法将其更改为外键。有关如何使用
加入
的更多详细信息,请参阅

在这种情况下,我建议为查找创建一个实体。但是如果你真的想采用这种方法,你可以用一个公式来映射属性,即

Map(x => x.Role).Formula("(select description from libRole where Id = RoleId)");

注意,这并不完美,因为它使用了
RoleId
,因此如果查询有另一个表,其中的列名为
RoleId
,那么DBMS在尝试执行SQL时会抱怨。

谢谢penfold。我们考虑了公式路由,但由于您提到的原因以及它不太可能像sql联接那样高效(不是因为我们处理的是libRole表上的数百万行,而是仍然如此),我们更愿意避免使用公式路由。似乎奇怪的是,没有办法让NHibernate从多个表中读取实体的数据?看起来不能通过外键连接已经有一段时间了。见和。有一些人倾向于添加这个功能,但它还没有与主干合并。我想真的没有办法。最后,我们实际上从对象中删除了角色属性,因为它没有在任何地方使用-这是10年前做出的设计决策的遗留问题。。。因此,我将此标记为答案,我想看到nhibernate在某个时候满足它会很好——我想如果我们真的想要它,我们可能不得不自己动手解决:)
Map(x => x.Role).Formula("(select description from libRole where Id = RoleId)");