nHibernate:如何在不更改数据库的情况下使用相同的复合ID设置一对多关系?

时间:2019-07-17 15:55:10

标签: nhibernate

我想在2个类之间建立一对多关系。这些类都有一个复合ID,除了一列外,其他都相同。但是我得到一个错误,因为我的ID名相同。

This topic实际上很好地描述了我的问题,但是答案对我没有用,因为我无法更改数据库中列的名称。

这是课程:

public class Parent
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public List<Child> Children { get; set; }
    public string Data { get; set; }
}
public class Child
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
    public Parent Parent { get; set; }
    public string Data { get; set; }
}

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        CompositeId()
            .KeyProperty(x => x.A)
            .KeyProperty(x => x.B)
            .KeyProperty(x => x.C);
        Map(x => x.Data);
        HasMany(x => x.Children)
                .KeyColumns.Add("A", "B", "C");
    }
}
public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        CompositeId()
            .KeyProperty(x => x.A)
            .KeyProperty(x => x.B)
            .KeyProperty(x => x.C)
            .KeyProperty(x => x.D);
        Map(x => x.Data);
        References<Parent>(x => x.Parent)
                .Columns("A", "B", "C");
                // Also tried adding this
                // .Not.Insert()
                // .Not.Update()
                // Another thing I tried was
                // .ReadOnly()
    }
}

当我尝试运行此代码时,会弹出以下异常: 创建SessionFactory时使用了无效或不完整的配置。检查PotentialReasons集合和InnerException以获取更多详细信息。

有这个内部异常: 无法为父类构建插入语句:添加类ID时失败

此内部异常具有另一个内部异常: 此SQL构建器中已经添加了列“ A” 参数名:columnName

如何在不更改数据库列名称的情况下进行管理?

(编辑) 我也尝试了使用普通的nhibernate xml映射,但是结果却有相同的例外:

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Assembly" namespace="Name.Space">
    <class name="Parent" table="Parent">
        <composite-id>
            <key-property name="A" column="A" />
            <key-property name="B" column="B" />
            <key-property name="C" column="C" />
        </composite-id>
        <property name="Data" />
        <set name="Children">
            <key>
                <column name="A" />
                <column name="B" />
                <column name="C" />
            </key>
          <one-to-many class="Child" />
        </set>
    </class>
</hibernate-mapping>

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Assembly" namespace="Name.Space">
  <class name="Child" table="Child">
    <composite-id>
      <key-property name="A" column="A" />
      <key-property name="B" column="B" />
      <key-property name="C" column="C" />
      <key-property name="D" column="D" />
    </composite-id>
    <many-to-one name="Parent" cascade="none" insert="false" update="false" not-null="true">
      <column name="A" />
      <column name="B" />
      <column name="C" />
    </many-to-one>
    <property name="Data" />
  </class>
</hibernate-mapping>

0 个答案:

没有答案