nhibernate:类映射没有表
我有一个实体类,我用它来表示一个SQL查询的结果。下面显示的类的映射。然而,据我所知,禁止将映射视为存在真正的数据库表 - 事实上并不存在。在这种情况下,数据库中根本没有任何东西代表这个实体。我正在使用它来映射查询,但视图也是如此。是否没有办法指示nhibernate没有映射表示的表格?nhibernate:类映射没有表
<class name="Models.UserTransaction"> <!-- Defaults table name same as Entity even though table doesn’t exist -->
<id name="Id">
<column name="Id" not-null="true" unique="true" />
<generator class="native" />
</id>
<property name="TransType" />
<property name="Date" />
<property name="Amount" />
<property name="Balance" />
</class>
这是查询我的映射,它使用一个用户定义的表。即使我复制的例子出现,我也无法在没有映射的情况下工作。
<sql-query name="UserTransactions">
<query-param name="userId" type="string" />
<return class="Models.UserTransaction" alias="userTx">
<return-property name="TransType" column="TransType" />
<return-property name="Id" column="Id" />
<return-property name="Date" column="TransDate" />
<return-property name="Amount" column="Amount" />
<return-property name="Balance" column="Balance" />
</return>
<![CDATA[
SELECT userTx.[Type] as TransType, userTx.[Id] as Id, userTx.[Date] as TransDate, userTx.[Amount] as Amount, userTx.[Balance] as Balance
FROM dbo.User_AccountStatement(:userId) userTx
]]>
</sql-query>
我想你至少应该指定一个视图你映射的表名。 视图应具有相同的产生列作为查询(希望返回的查询可以返回任何行)
然后,你将能够:
- 你的属性映射到您的视图/ SQL查询结果列
- 设置你的类为可变=“假”
- 声明你的查询作为一个命名查询(见:http://ayende.com/blog/3948/nhibernate-mapping-named-queries-query-and-sql-query)
重要的不在于是否命名它,因为默认值是实体名称。否则你是正确的,这就是我所做的,但我的问题是,是否有任何方法可以告诉nhibernate它的单向映射(请参阅我对我的问题的评论),因为看起来nhibernate认为是错误的它的两种方式,当它不是。我在日志文件中看到它为它生成一个插入语句。最初它也生成了一个更新,但是通过设置mutable = false解决了这个问题,这个问题在似乎已被删除的答案中提出。 – 2012-04-30 11:23:25
@DaleBurrell:你有没有试过把你的id映射变成一个带有列映射的简单属性,保持一个唯一的约束,用insert = false和update = false(并重复更新并为所有其他属性插入部分)? – jbl 2012-04-30 12:07:51
如果你甲肝在数据库视图中,您可以使用nhibernate映射到该视图,但如果您所做的只是存储查询的投影字段,则根本不需要是映射。
你是如何查询这些数据的?
如果您使用的是标准API,则可以使用resultstransformer将返回的对象数组映射到您的类。类型必须与你的类之间的投影相匹配。
如果您使用linq提供程序,则可以直接将其投影到您的课程中。所以你必须从s这样的事情
在Session.Query 其中s.some属性==“一些价值” 选择新的类型 { 一些属性上,你的型= s.some属性, 一些,其他的属性上,你的型= s.some-其他属性 }
没有必要写一个映射到数据库中,因为你不是映射到数据库中的一个对象。
好的,我已经编辑了我的问题,以表明我正在使用sql-query,如果没有映射,我无法使其工作,但也许这是我出错的地方? – 2012-04-30 20:56:00
如果你不想将你的类映射到数据库,那么......你为什么要映射它? :)只是完全删除映射,告诉nHib不映射它,这就是 – 2012-04-30 07:48:24
由于问题说我想将它映射到查询的结果,如报告,所以单向(即数据库到应用程序)映射。对于nhibernate来说,认为把它当作不是双向映射的时候认为它是错误的。 – 2012-04-30 11:21:11
看着另一个查询问题,我再次想到了你的问题。你实际上是在为SQL查询和DTO搜索一些ResultTransformer吗? http://relation.to/Bloggers/Hibernate32TransformersForHQLAndSQL#H-SQLTransformers – jbl 2012-05-02 15:49:39