【问题标题】:XML validation error: The 'fetch' attribute is not declaredXML 验证错误:未声明“获取”属性
【发布时间】:2017-11-07 10:20:27
【问题描述】:

我是 NHibernate 的新手,我发现映射两个表关系的问题。 我在 SQL Server 数据库中有两个表 cafe_tablecafe_table_group。它们都有各自唯一 ID 的自动增量和标识列。

虽然foreign key在表中显示,但我不会有。

这是我的 cafe_table.hbm.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="CafePOS" namespace="CafePOS" xmlns="urn:nhibernate-mapping-2.2">
  <class name="CafePOS.CafeTable" table="cafe_table" lazy="true" >
    <id name="cafe_table_id" column="cafe_table_id">
      <generator class="identity" />
    </id>
    <property name="cafe_table_group_id">
      <column name="cafe_table_group_id" sql-type="decimal" not-null="false" />
    <many-to-one name="cafe_table_group" class="CafePOS.CafeTableGroup" column="cafe_table_group_id" fetch="select"/>
  </class>
</hibernate-mapping>

我的 cafe_table.hbm.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="CafePOS" namespace="CafePOS" xmlns="urn:nhibernate-mapping-2.2">
  <class name="CafePOS.CafeTableGroup" table="cafe_table_group" lazy="true" >
    <id name="cafe_table_group_id" column="cafe_table_group_id">
      <generator class="identity" />
    </id>
    <set name="cafe_table" table="`cafe_table`">
      <key column="cafe_table_group_id"/>
      <one-to-many class="CafePOS.CafeTable"  fetch="select"/>
    </set>
  </class>
</hibernate-mapping>

cafe_table 将与cafe_table_group_id 上的cafe_table_group 具有many-to-one 关系,cafe_table_group 将与cafe_table 具有one-to-many 关系。

我的模型 CafeTable 类: 命名空间 CafePOS {

    public class CafeTable {
        public virtual decimal cafe_table_id { get; set; }
        public virtual decimal cafe_table_group_id { get; set; }
        public virtual CafeTableGroup cafe_table_group { get; set; }
    }
}

我的 CafeTableGroup 模型类:

namespace CafePOS {
    public class CafeTableGroup {
        public virtual decimal cafe_table_group_id { get; set; }
        public virtual string cafe_table_group_name { get; set; }
        public virtual IList<CafeTable> cafe_table { get; set; }
    }
}

我只希望 SELECT 语句的这种关系类似于 SQL 查询中的 INNER JOIN。

【问题讨论】:

  • OT:如果不是必需的,则避免使用 hbm 文件。它们容易出错且难以阅读。您可以使用内置的 FluentMapping 或 FluentNHibernate 来映射您的实体。在 C# 中,以 UpperCamelCase 命名您的属性并且不带下划线是很常见的。

标签: c# nhibernate


【解决方案1】:

在子表中,我们应该将引用映射为可编辑,并将其 ID 设为只读

<class name="CafePOS.CafeTable" table="cafe_table" lazy="true" >
    <id name="cafe_table_id" column="cafe_table_id">
      <generator class="identity" />
    </id>
    <property name="cafe_table_group_id" insert="false" update="false">
      <column name="cafe_table_group_id" sql-type="decimal" not-null="false" />
    </property>
    <many-to-one name="cafe_table_group" 
         class="CafePOS.CafeTableGroup" 
         column="cafe_table_group_id" fetch="select"/>
  ...

并且父级应该有没有fetch 模式的集合 - 而且,应该使用级联......

<class name="CafePOS.CafeTableGroup" table="cafe_table_group" lazy="true" >
    <id name="cafe_table_group_id" column="cafe_table_group_id">
      <generator class="identity" />
    </id>
    ...
    <!--<set name="cafe_table" table="`cafe_table`">-->
    <set name="cafe_table" table="`cafe_table`" cascade="all-delete-orphan" >
      <key column="cafe_table_group_id"/>
      <!--<one-to-many class="CafePOS.CafeTable"  fetch="select"/>-->
      <one-to-many class="CafePOS.CafeTable" />
    </set>

现在分配双方

var parent = ...;
var child = ...;
parent.cafe_table.Add(child);
child.cafe_table_group = parent;
// this will be enough.. because cascade will do the rest in proper order
session.SaveOrUpdate(parent);

这里有更详细的解释如何处理这个问题:

【讨论】:

  • 先生,但直到我在添加新的 CafeTable 时执行 transaction.commit(),cafe_table_group_id 才可用。执行提交后,我在数据库中发现“cafe_table_group_id”为空。我有一个如上图所示的外键。
  • 不..你是幸运的人!这就是为什么你应该保持引用为可编辑的......甚至更多......我们必须要求 NHibernate 进行级联......检查更新......
  • 对不起,先生,我遇到了问题。这就是我所做的:** var parent = new CafeTableGroup(); var child = _table; parent.cafe_table.Add(child); child.cafe_table_group = 父母; session.SaveOrUpdate(父); ** 我从 ** parent.cafe_table.Add(child);** 得到对象引用未设置为对象错误的实例。我只是想在 cafe_table table 中添加 cafe_table_group_id 我的代码应该保存什么。请更新您的答案一次
  • 对象引用未设置...哪个引用?是否创建了父级?是否正确创建了孩子?我的代码中没有那么多魔力。它确实是一个标准。所以,我需要了解更多关于你最新异常的信息 - nhibernate.info/doc/nh/en/index.html#collections 有同样的例子
  • 非常感谢先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2017-03-27
  • 2021-12-16
相关资源
最近更新 更多