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場合、SQL を実行しようとすると DBMS からエラーが発生します。

于 2013-04-15T12:10:31.707 に答える