1

私のプロジェクトでは、すべてのエンティティに複合主キー[systemId as long、deviceId as long、idaslong]があります。エンティティを保存する前に、値を手動で入力しました。私は「コードファースト」アプローチを使用しており、JavaベースのHibernateと同じように、属性を持つスキーマを定義するためにNHibernate.Mapping.Attributes拡張機能を簡単に参照できるようにしています。

すべてのエンティティには、共有プロパティと機能を提供する抽象基本タイプがあります。

[Serializable]
public abstract class EntityBase
{

    [CompositeId(0, Name = "id", ClassType = typeof(EntityId))]
    [KeyProperty(1, Name = "systemId", Column = "restId")]
    [KeyProperty(2, Name = "deviceId", Column = "deviceId")]
    [KeyProperty(3, Name = "id", Column = "id")]
    private EntityId id = new EntityId(); // this is a component, see below

    [Property(Column = "isDeleted", NotNull = true)]
    private bool deleted = false;

    public EntityId Id 
    { 
        get { return id; }
        set { id = value; }
    }

    public bool Deleted 
    {
        get { return deleted; }
        set { deleted = value; }
    }

}

複合IDの後ろには、複雑な主キーを表すコンポーネントがあります。

[Serializable]
[Component]
public class EntityId
{

    [Property(Column = "restId", NotNull = true)]
    private long systemId = 0;

    [Property(NotNull = true)]
    private long deviceId = 0;

    [Property(NotNull = true)]
    private long id = 0;

    public long SystemId 
    {
        get { return systemId; }
        set { systemId = value; } 
    }

    public long DeviceId 
    {
        get { return deviceId; }
        set { deviceId = value; } 
    }

    public long Id 
    {
        get { return id; }
        set { id = value; } 
    }

}

OTMListとOTMItemという2つのエンティティを定義しました。これらのエンティティには、相互に双方向のOneToManyとManyToOneの関連付けがあります。

[Serializable]
[Class]
public class OTMList : EntityBase
{

    [List(0, Cascade = "none", Generic = true, Lazy = CollectionLazy.True)]
    [Key(1, Column = "id")]
    [Index(2, Column = "id")]
    [OneToMany(3, NotFound = NotFoundMode.Exception, ClassType = typeof(OTMItem))]
    private IList<OTMItem> otmItems = new List<OTMItem>();

    public IList<OTMItem> OTMItems
    {
        get { return otmItems; }
        set { otmItems = value; }
    }

}

[Serializable]
[Class]
public class OTMItem : EntityBase
{

    [ManyToOne(0, Name = "otmList", ClassType = typeof(OTMList), Column = "OTMListId", Cascade = "none", Lazy = Laziness.Proxy)]
    private OTMList otmList = null;

    public OTMList OTMList
    {
        get { return otmList; }
        set { otmList = value; }
    }

}

Hibernateマッピングxmlファイルには、次の情報が含まれています。

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping default-access="field" auto-import="true" assembly="NHibernateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="urn:nhibernate-mapping-2.2">
  <class name="NHibernateTest.ListTest.OTM.OTMList, NHibernateTest">
    <composite-id class="NHibernateTest.Domain.EntityId, NHibernateTest" name="id">
      <key-property name="systemId" column="restId" />
      <key-property name="deviceId" column="deviceId" />
      <key-property name="id" column="id" />
    </composite-id>
    <property name="deleted" column="isDeleted" not-null="true" />
    <list name="otmItems" lazy="true" cascade="none" generic="true">
      <key column="id" />
      <index column="id" />
      <one-to-many class="NHibernateTest.ListTest.OTM.OTMItem, NHibernateTest" not-found="exception" />
    </list>
  </class>
  <class name="NHibernateTest.ListTest.OTM.OTMItem, NHibernateTest">
    <composite-id class="NHibernateTest.Domain.EntityId, NHibernateTest" name="id">
      <key-property name="systemId" column="restId" />
      <key-property name="deviceId" column="deviceId" />
      <key-property name="id" column="id" />
    </composite-id>
    <property name="deleted" column="isDeleted" not-null="true" />
    <many-to-one name="otmList" class="NHibernateTest.ListTest.OTM.OTMList, NHibernateTest" column="OTMListId" cascade="none" lazy="proxy" />
  </class>
</hibernate-mapping>

NHibernateのSchemaValidatorを使用してスキーマを検証すると、次の例外が発生します。

Foreign key (FKF208BF0B9A2FCB3:OTMItem [OTMListId])) must have same number of columns as the referenced primary key (OTMList [restId, deviceId, id])

単方向のManyToOneまたは双方向/単方向のManyToManyアソシエーションを作成しようとした場合も、問題は同じです。

誰かが私を助けてくれますか?

ここで利用可能な完全なソースコード:

NHibernateTestのソースコード

4

1 に答える 1

0

問題は解決しました。これを確認してください。

http://jzo001.wordpress.com/category/nhibernate/

于 2013-01-25T06:40:43.887 に答える