私はテーブルを持っています:
Page (
Id int,
Name nvarchar(50),
TemplateName varchar(50)
...
)
そしてそれはドメインモデルにマッピングされています:
public class Page {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Template Template { get; set; }
}
ドメイン モデルでは、"Template" プロパティは "string" 型ではないことに注意してください。Template クラスは次のようになります。
public class Template {
public string Name { get; set; }
// other properties...
}
「テンプレート」はファイル システムからロードされます。私は TemplateManager クラスを持っています:
public class TemplateManager {
public static Template LoadTemplate(string templateName) {
// check if there's a folder named <templateName>
}
}
IUserType を使用して、「テンプレート」プロパティをマップできます。
public class PageMap : ClassMapping<Page> {
public PageMap() {
...
Property(c => c.Template, m => {
m.Column("TemplateName");
m.Type<TemplateUserType>();
}
}
}
public class TemplateUserType : IUserType {
public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
{
var templateName = rs[names[0]].AsString();
if (!String.IsNullOrEmpty(templateName))
{
return TemplateManager.LoadTemplate(templateName);
}
return null;
}
}
さて、これまでのところとても良いです。しかし、問題は、Linq クエリで Template プロパティをどのように使用できるかということです。例:
var pages = session.Query<Page>().Where(it => it.Template.Name == "MyTemplate");
解決策は、を実装するクラス(たとえば、TemplatePropertyHqlGenerator)を作成することだと思いますIHqlGeneratorForProperty
。これは NHibernate 3 が提供する linq クエリ拡張ポイントです。しかし、この TemplatePropertyHqlGenerator クラスをどのように記述するのでしょうか?
ありがとうございます!