2010-07-23 49 views
0

考虑这些波苏斯:入门映射从ISQLQuery实体没有AddEntity

class Foo { 
    int Id {get;set;} 
    string Name {get;set;} 
} 

class Bar { 
    int Id {get;set;} 
    string PropA {get;set;} 
    Foo PropB {get;set;} 
} 

现在,我要的是使用ISQLQueryBar根实体也滋润PROPB属性来实现。

ISQLQuery barsAround = nhSes.CreateSQLQuery("select b.Id, b.PropA, {????} from Bar b inner join Foo f on f.Id = b.FK_FooId"); 
barsAround.SetResultTransformer(Transformers.AliasToBean<Bar>()); 
IList<Bar> results = barsAround.List<Bar>(); 

其中在{????}是取入b.Id和b.Name和水合物实体栏的属性PROPB的片段。

我不能使用ISQLQuery.AddEntity(),因为这会导致托管实体,我不能使用托管实体。获取的条形是条形的版本,因此每行的相同ID会杀死NHibernate引擎。

回答

2

你可以编写自己的ad-hoc变压器。这并不难,看看AliasToBeanResultTransformer的来源。

更好的选择是编写一个实际反映您的数据库和域的对象模型。如果Bar有多个版本,那么版本号(或用于识别它的任何内容)应该是密钥的一部分。

这样你就可以摆脱所有的黑客行为。

+0

不,正常的应用程序操作总是获取最新版本。它的特定部分(如审计),我想要一个特定的实体与一个给定的ID的版本列表....我会研究一个自定义变压器,你有任何我可以看看的例子? – Jaguar 2010-07-23 20:59:52