0

NHibernate を使用しており、データベース ビューから単一のフィールドをモデルにロードしたいと考えています。状況は次のとおりです。

AVATAR_ID という列を持つ USERS テーブルが 1 つあります。VIEW_RESOURCES と呼ばれるデータベースで定義された別のビューもあります。このビューには、ID 列と PATH 列が含まれています。ID は、AVATAR_ID 列に格納されている値と照合できます。

SQLでは、次のことを行います。

select U.ID, U.USERNAME, R.PATH
from USERS U
left join VIEW_RESOURCES R on R.ID = U.AVATAR_ID
where U.ID = ...

C# コードでモデルのプロパティを次のように定義しました。

public virtual Id { get; protected set; }
public virtual string UserName { get; set; }
public virtual string AvatarPath { get; protected set; }

マッピングには FluentNHibernate を使用しています。これは次のようになります。

Table("USERS");
Id(x => x.Id).GeneratedBy.Identity().Column("ID");
Map(x => x.UserName).Column("USERNAME").Not.Nullable().Length(256);

単一のユーザーをロードするために使用されるコードは次のようになります。

User user = session
.QueryOver<User>()
.Where(x => x.Id == id)
.SingleOrDefault();

ここまでは順調ですが、知っておくべきことは次のとおりです。

  • AvatarPath のマッピングを定義する方法は?
  • VIEW_RESOURCES ビューの PATH 列を User オブジェクトの AvatarPath プロパティにロードする方法は? ユーザーと関係のある別のモデルとしてロードしたくありません。可能であれば、User のプロパティとして使用したいと考えています。
4

1 に答える 1

3

フォーミュラとしてマッピングできます

Map(x => x.AvatarPath).Formula("(SELECT R.PATH FROM VIEW_RESOURCES R WHERE R.ID = AVATAR_ID)");

それ以外は、モデルと参照を非公開にして、外部に出ないようにすることができます

于 2013-02-18T19:12:32.347 に答える