0

我们有以下数据库结构:

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(即,使用带有覆盖的 Automapping 类)。

我们试图将 libRole 表中的描述列放入 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" );
            } );
    }

}

这会生成以下 SQL:

SELECT
    TOP (@p0)  this_.Id as Id70_0_,
    this_.RoleId as RoleId70_0_,
    this_.TeamId as TeamId70_0_,
    this_.UserId as UserId70_0_,
    this_1_.Description as Descript2_71_0_ 
FROM
    [UserTeam] this_ 
inner join
    libRole this_1_ 
        on this_.Id=this_1_.Id;

关闭,但 NHibernate 应该在连接中使用 UserTeam 表和 libRole 表上的 Id 列this_.RoleId=this_1_.Id

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

4

1 回答 1

0

Join使用父表的主键。无法将其更改为外键。有关使用Join. _

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

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

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

于 2013-04-15T12:10:31.707 回答