0

私はNHibernate(最新バージョンを使用)が初めてで、汎用データロードアプリケーションのオブジェクトをデータベースにマッピングする際に問題があります。データベースはサードパーティであるため、そこに変更を加えることはできません。

私たちの目的は次のとおりです。

public class GenericObjectValue
{
    public string ObjectId { get; set; }
    public string ObjectTypeId { get; set; }
    public string measurementId { get; set; }
    public DateTime timestamp { get; set; }
    public Double Value { get; set; }
}

使用するデータソース テーブル:

Table t_data_point
(
    id (PK, int, not null)
    object_id (FK, Varchar(30), not null)
    object_type_id (FK, Varchar(30), not null);
    measurement_id (FK, Varchar(30), not null);
)


Table t_data_point_Value
(
    data_point_id (PK, FK, int, not null)
    timestamp (PK, FK, datetime, not null)
    version (PK, FK, int, not null)
    value (numeric(18,6), not null);
) 

私が設定したマッピングは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Phoenix.Model"     assembly="Phoenix.Common">
 <class name="MeasValue" table="t_data_point_Value">
  <id column="data_point_id" type="int" />
  <property name="Timestamp" column="timestamp "/>
  <property name="Value" column="value"/>

  <join table="t_data_point">
       <key column="id" />
       <property name="measurementId" column="measurement_id" />
       <property name="ObjectId" column="object_id" />
       <property name="ObjectTypeId" column="object_type" />
  </join>
 </class>
</hibernate-mapping>

私が何か愚かなことをしているのか、それとも不可能なことをしているのかはわかりませんが、このコードを実行すると正しい数の結果が返されますが、結果は最初に返された結果の複製です。つまり、タイムスタンプと値は同じ。

さらに情報が必要な場合は、お知らせください。

4

1 に答える 1

0

ID が正しくマッピングされていない場合、つまり一意ではない列にマッピングされている場合に、これを見てきました。Nhibernate は、同じ ID を持つキャッシュ内で最初に見つかったオブジェクトを再利用します。正しい方向を示すのに役立つ無料のマッピング ツールがあります。結合は作成されませんが、基本的な列と ID http://nmg.codeplex.comが作成されます。

于 2013-02-20T19:32:57.123 に答える