2011-05-27 94 views
1

我知道这个问题可能会导致一个主观的答案,但我想从其他人那里得到一个意见。在NHibernate中映射隐藏属性的最佳方式(流利)

一些背景 目前,我有一个公用字符串WKT一个私人字符串属性映射到一个PostgreSQL(PostGIS的)数据库表中的几何列一类。 WKT被PostGIS用于使用触发器自动更新几何列。由于我不想在域模型中包含任何空间参考,因此所有查询均使用WKT字符串和自定义空间标准完成,该空间标准将WKT包装在空间PostGIS函数中,并查询专用几何特性列参考。所有这些按预期工作。

问题 因为我需要的列引用,我还需要物业在我的DomainModel,对NHibernate的映射到,所以我在想,最好的解决办法是什么,对NHibernate的,以从未选择这个性质。

我目前的解决方案看起来与功能NHibernate如下:

Map(Reveal.Member<LocationReference>("Geometry"), "geometry") 
    .Generated.Always() 
    .ReadOnly() 
    .LazyLoad(); 

这是卓有成效的,当我选择实体,我不会得到的财产,除非我手动加载它(这ISN”通过lambda扩展可能)。不幸的是,我仍然可以为该属性进行Criteria或HQL查询。

那么有没有什么办法可以让我做任何事情来阻止NHibernate能够做到曾经有过包括select中的列?或者,上述解决方案是在与Query<>QueryOver<>一起选择时至少忽略列的唯一方法?

+0

我不太了解,并您的域名实际使用此LocationReference私有财产?在您的域中使用它有什么用途? – Vadim 2011-05-27 21:30:32

+0

嗯,我实际上只需要属性就可以让NHibernate在执行查询时意识到它。 NHibernate应该自动映射到正确的列别名,并且正如我写的那样,我创建了一个自定义空间标准,该标准使用该属性的字符串名称。 – Siewers 2011-05-28 03:59:12

回答

0

那么,我最终删除了映射的属性,因为即使它很懒,NHibernate有时也会加载它。我所做的实际上有点破绽。我需要来自同一个类的属性的别名,所以我使用了另一个属性的映射,并将SqlString分为'.',以获取正确的别名。

所有这些对我来说都很合理,“解决方法”并不好,但我没有看到其他任何方式。 NHibernate需要知道,它处理的是什么属性,分配正确的别名。由于我没有映射该属性,因此无法知道,我在寻找什么别名。

我想我做了很多黑客,只是为了避免引用NHibernate.Spatial ...