1

私は通常NHibernate2.2を使用しないので、適切な説明を見つけることができない質問がいくつかあります。ポイントとファイルの2つのテーブルがあります。

C#クラスとして宣言:

[Serializable]
    public class PPoint
    {
        public PPoint()
        {
        }

        public virtual int PPointID { get; set; }
        public virtual int Position { get; set; }
        public virtual int ImportID { get { if (ImportFile == null) return -1; else return ImportFile.ImportID; } }
        public virtual PPImportFile ImportFile { get; set; }

        public virtual int Name{ get; set; }
        //more properties
    }

[Serializable]
public class PPImportFile
{
    public PPImportFile()
    {
        Points = new List<PPoint>();
    }

    private static Repositories.PPointRepository ppr; 

    public virtual int ImportID { get; set; }
    public virtual string FileName{ get; set; }
    public virtual DateTime CreateDate { get; set; }

    public virtual IList<PPoint> Points { get; set; }

    public virtual int PointCount { get { return Points.Count; } }
}

私のマッピングは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="WebGPS.Data"
                   namespace="WebGPS.Data.Domain">

<id name="PPointID" column ="PPointID" type="System.Int32" unsaved-value="-1">
    <generator class="assigned"></generator>
</id>
<property name="Position" />
<!--<property name="ImportID" />-->
<many-to-one name="ImportFile" column="ImportID" update="true" insert="true" not-null="true" cascade="all-delete-orphan"  />

    <property name="Name" />
  </class>

</hibernate-mapping>

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       assembly="WebGPS.Data"
                       namespace="WebGPS.Data.Domain">

  <class name="PPImportFile" lazy="true">
    <id name="ImportID" column ="ImportID" type="System.Int32" unsaved-value="-1">
        <generator class="assigned"></generator>
    </id>
    <property name="FailoPav" />
    <property name="ImportoData" />
    <property name="ImportavoVart" />

    <list name="Points" table="PPoint" cascade="all" lazy="true">
      <key column="PPointID" not-null="true" unique="true"/>
      <index column="Position"/>
      <one-to-many class="PPoint"/>
    </list>
  </class>

</hibernate-mapping>

ポイント付きの新しいファイルを挿入するコード:

PPImportFile file = new PPImportFile();

int newPointID = pp.GetNewPontID(); // Get next Point ID from repository
do
{
   PPoint pt = new PPoint();
   pt.PPointID = newPointID;
   pt.ImportFile = file;
   // assign other properties

   file.Points.Add(pt);
   newPointID +=1;
} while (!eof)

if (fileNew)
    repository.Add(file); 
else
    repository.Update(file); // get an error here

ポイントテーブルとクラスにPosition列を追加しましたが、既存のレコードを読み込んだ後にポイントのコレクションを取得しようとすると、古いエラーが発生 します:ロールのコレクションを遅延初期化できませんでした:PPImportFile.Points

4

1 に答える 1

1

2 つの問題があります。最初に常にコレクションをインターフェイスとしてマップします。使用可能なタイプはここにリストされています6.1. 永続的なコレクション (例IList: Iesi.Collections.ISet)

次に、インデックス列です。C# IList は (List が良い例です) 1 つの値を何度も含むコレクションとして実装できます (同じ Point を複数回追加できます)。.NET がこのリスト内の項目を区別できるようにする唯一の情報は、インデックスです。そして、それがNHibernateがサポートするものです

したがって、マッピングが次のようになる場合:

public virtual IList<PPoint> Points { get; set; }

<list>そして、テーブルに「ForeignKey」列とゼロベースの「Index」列が必要であるため、それをマップしたいとします。そのインデックス列は NHibernate によって管理され、IListインデックス値が入力されます。詳細はこちら19.5.1. 分類法

提案:

データベースを変更できない場合は、インデックス列を避けるようにマッピングを変更します。

は、いくつかのパフォーマンスの問題がある (リンクを読む)IList<PPoint>としてマップされる可能性があり<bag>ますが、うまく機能します。

Iesi.Collections.Generic.ISet<T>および<set>マッピングを使用します。Set は、各値がコレクションに一度だけ追加されることを保証します。

詳細は<list>こちらhttp://ayende.com/blog/4043/nhibernate-mapping-list

于 2013-02-05T04:57:16.010 に答える