首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate 3 Linq和IUserType

NHibernate 3 Linq和IUserType
EN

Stack Overflow用户
提问于 2012-05-13 10:52:29
回答 1查看 345关注 0票数 0

我有张桌子:

代码语言:javascript
复制
Page (
   Id int,
   Name nvarchar(50),
   TemplateName varchar(50)
   ...
)

它被映射到域模型:

代码语言:javascript
复制
public class Page {
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
   public virtual Template Template { get; set; }
}

注意,在域模型中,"Template“属性不是"string”类型。模板类如下所示:

代码语言:javascript
复制
public class Template {
   public string Name { get; set; }
   // other properties...
}

“模板”从文件系统加载。我有一个TemplateManager类:

代码语言:javascript
复制
public class TemplateManager {
    public static Template LoadTemplate(string templateName) {
        // check if there's a folder named <templateName>
    }
}

我可以使用IUserType映射“模板”属性。

代码语言:javascript
复制
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属性?特别代表:

代码语言:javascript
复制
var pages = session.Query<Page>().Where(it => it.Template.Name == "MyTemplate");

我认为解决方案可能是编写一个实现TemplatePropertyHqlGenerator的类(比如IHqlGeneratorForProperty )。这是NHibernate 3. 提供的linq查询扩展点,但是如何编写这个TemplatePropertyHqlGenerator类?

感谢先进的!

EN

回答 1

Stack Overflow用户

发布于 2012-05-13 11:11:04

IUserType接口允许您定义一个被认为是原子的类型。也就是说,您可以在该类型的实例和NHibernate将知道如何转换它们之间执行直接比较。

例如,以下查询将对以下问题进行评估:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10571138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档