【问题标题】:Is my NHibernate book wrong?我的 NHibernate 书错了吗?
【发布时间】:2011-05-31 15:27:28
【问题描述】:

我开始学习 NHibernate (3.0) 并拿起了 Packt Publishing 的 NHibernate 3.0 Cookbook 的副本。

我正在浏览有关一对多映射的部分,但使用的是我自己的数据库。它建议我应该做这样的事情来模拟客户与其域之间的一对多关系:

public class Customer
{
  public virtual int Id { get; protected set; }
  public virtual string CustomerName { get; set; }
  // Customer has many domains
  public virtual IList<Domain> Domains { get; set; }
}

public class Domain
{
  public virtual int Id { get; protected set; }
  public virtual int CustomerID { get; set; }
  public virtual string DomainName { get; set; }
}

客户映射:

<class name="Customer" table="tblCustomer">
  <id name="Id">
    <column name="CustomerID" sql-type="int" not-null="true"/>
    <generator class="identity"/>
  </id>

  <property name="CustomerName" column="Customer"/>
  <list name="Domains">
    <key column="CustomerID"/>
    <one-to-many class="Domain" />
  </list>
</class>

当我运行它时,我收到以下错误:

XML 验证错误:命名空间“urn:nhibernate-mapping-2.2”中的元素“列表”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“一对多”。预期的可能元素列表:命名空间 'urn:nhibernate-mapping-2.2' 中的 'index, list-index'。

这本书的例子有点复杂,因为它们使用每个子类的表映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="Eg.Core"
    namespace="Eg.Core">
  <subclass name="Movie" extends="Product">
    <property name="Director" />
    <list name="Actors" cascade="all-delete-orphan">
      <key column="MovieId" />
      <index column="ActorIndex" />
      <one-to-many class="ActorRole"/>  <-- Is this wrong?
    </list>
  </subclass>
</hibernate-mapping>

我猜这本书是错的?

【问题讨论】:

  • 从错误消息中,可以很容易地假设one-to-many 永远不会是list 的孩子。我会在错误消息中称其为错误。

标签: nhibernate nhibernate-mapping


【解决方案1】:

不,您的映射缺少 index 元素。 NHibernate 中的列表是一个有序集合,如果你想要一个无序集合使用包映射。

【讨论】:

  • 列表映射需要一个映射到列表索引器值的列。袋子或套装在您的情况下会更合适。集合不允许重复并且可以排序,而包只是元素的简单集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多