【问题标题】:nhibernate: Class Mapping with no tablenhibernate:没有表的类映射
【发布时间】:2012-05-01 04:55:05
【问题描述】:

我有一个实体类,用于表示 sql 查询的结果。类的映射如下所示。然而,据我所知,nhiberate 将映射视为有一个真正的数据库表 - 而实际上没有。在这种情况下,数据库中根本没有代表该实体的任何内容。我正在使用它来映射查询,但视图也是如此。有没有办法指示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>

【问题讨论】:

  • 如果你不想将你的类映射到数据库,那么..你为什么要映射它? :) 完全删除映射,告诉 nHib 不要映射它,就是这样
  • 正如问题所说,我想将其映射到查询结果,例如报告,因此是一种单向(即数据库到应用程序)映射。对于 nhibernate 来说,将其视为双向映射似乎是错误的。
  • 查看另一个查询问题,我再次想到了您的问题。您实际上是在为 SQL 查询和 DTO 搜索一些 ResultTransformer 吗? relation.to/Bloggers/…
  • @DaleBurrell:我现在遇到了这个确切的问题。拥有单向映射非常有意义。 ORM 是一个对象关系 Mapper。这并不意味着支持插入、更新和删除。它是一种将关系数据映射到面向对象数据的工具。我真的希望 NHibernate 只允许读取/选择查询结果的映射。我们需要从许多其他表中加载数据,而创建用于生成报告的视图对于我们的场景来说太过分了。

标签: nhibernate nhibernate-mapping


【解决方案1】:

如果您有一个 db 视图,您可以使用 nhibernate 映射到该视图,但如果您所做的只是存储查询的投影字段,则根本不需要映射。

您如何查询这些数据?

如果您使用标准 API,您可以使用 resultstransformer 将返回的对象数组映射到您的类。类型必须与您的投影类之间的匹配。

如果您使用的是 linq 提供程序,您可以直接投影到您的课程中。所以你会有这样的东西

来自 Session.Query 中的 s 其中 s.some-property== "some-value" 选择新的你的类型 { 你的类型上的一些属性= s.some-property, 你的类型上的一些其他属性 = s.some-other-property }

由于您没有映射到数据库中的对象,因此无需编写到数据库的映射。

【讨论】:

  • 好的,我已经编辑了我的问题以表明我正在使用 sql 查询,如果没有映射,我无法让它工作,但也许这就是我出错的地方?
【解决方案2】:

我想您至少应该指定一个视图作为映射的表名。 该视图应该具有与您的查询相同的结果列(并希望返回您的查询可以返回的任何行)

然后你就可以:

【讨论】:

  • 是否命名无关紧要,因为默认是实体名称。否则你是对的,这正是我所做的,但我的问题是,有没有办法告诉 nhibernate 它是一种单向映射(请参阅我对我的问题的评论),因为 nhibernate 认为它似乎是错误的它不是两种方式。我查看了日志文件,因为它为它生成了一个插入语句。最初它还生成了一个更新,但通过设置 mutable=false 解决了这个问题,这在似乎已被删除的答案中提出了建议。
  • @DaleBurrell :您是否尝试过将您的 id 映射转换为具有列映射的简单属性,保持唯一约束,使用 insert=false 和 update=false (并重复更新和插入所有部分你的其他属性)?
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2013-03-26
相关资源
最近更新 更多