【问题标题】:Fluent NHibernate mapping to return description from lookup table流畅的 NHibernate 映射以从查找表返回描述
【发布时间】:2013-04-15 11:16:04
【问题描述】:

我们有以下数据库结构:

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”实体,因为我们真正关心的是描述值——这是用户可配置的,所以我们也不能只使用枚举。有人可以帮忙吗?

【问题讨论】:

    标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢 penfold。我们考虑了公式路线,但由于您提到的原因以及它不太可能像 sql 连接那样高效(不是我们正在处理 libRole 表上的数百万行,但仍然)。似乎奇怪的是,没有办法让 NHibernate 从多个表中读取实体的数据?
    • 看起来无法通过外键加入已成为一段时间以来的一个悬而未决的问题。请参阅 NH-1452NH-3143。有一些 work done 想要添加此功能,但尚未与主干合并。
    • 猜猜没有办法绕过它。最后,我们实际上从对象中删除了 Role 属性,因为它没有在任何地方使用 - 这是 10 年前做出的设计决定的遗留物......所以我将其标记为答案,认为它会是很高兴看到 nhibernate 在某些时候迎合了它 - 猜想如果我们真的想要它,我们可能不得不分叉并修复自己:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2016-01-17
    • 2010-11-22
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多