我有张桌子:
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”类型。模板类如下所示:
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类?
感谢先进的!
发布于 2012-05-13 11:11:04
IUserType接口允许您定义一个被认为是原子的类型。也就是说,您可以在该类型的实例和NHibernate将知道如何转换它们之间执行直接比较。
例如,以下查询将对以下问题进行评估:
var template = new Template();
session.Query<Page>().Where(it => it.Template == template);如果您想要定义一个具有组件值的类型,然后可以对其进行操作,则需要实现ICompositeUserType接口。这个接口要求您将类型的属性定义为原子元素,为NHibernate提供它理解该类型的特定属性所需的信息。
因此,它的实现比IUserType要复杂一些,但它应该有助于实现您想要实现的目标。
下面是实现Money类型接口的一个可以理解的示例:http://geekswithblogs.net/opiesblog/archive/2006/08/05/87218.aspx
https://stackoverflow.com/questions/10571138
复制相似问题