3

2つのテーブルと1つのビューがあります。

TABLE "Table_1" (
    "Id" INTEGER NOT NULL DEFAULT AUTOINCREMENT,
    "Field_1" VARCHAR(11) NOT NULL,
    PRIMARY KEY ( "Id" ASC )
) IN "system";

TABLE "Table_2" (
    "Table_1_Id" INTEGER NOT NULL,  //// (THIS FIELD HAVE A FOREIGN KEY WITH TABLE "Table_1" FIELD "Id")
    "Field_2" VARCHAR(11) NOT NULL,
    PRIMARY KEY ( "Table_1_Id" ASC )
) IN "system";

VIEW "vwView_1"()
AS
select 
    Id, 
    Field_1, 
    Field_2 
from Table_1 key join Table_2

これはビューマップです:

...
Table("vwView_1");
Mutable(false);
Id(x => x.Id);
Property(x => x.Field_1);
Property(x => x.Field_2);
...

これは、データベース内のデータの表示です。

Id  Field_1  Field_2
1   Green    Blue
1   Green    Red
2   Black    White
3   Orange   Blue
6   Red      Orange
6   Red      Green

nHibernateでデータを取得すると、次のデータが取得されます。

Id  Field_1  Field_2
1   Green    Blue
1   Green    Blue
2   Black    White
3   Orange   Blue
6   Red      Orange
6   Red      Orange

問題はビューマップにあると思いますが、これを解決する方法が見つかりません:(

誰かが解決するアイデアを持っていますか?

4

2 に答える 2

2

Id 列が Identifier フィールドとしてマップされているため、NHibernate の最初のレベルのキャッシュは、既にキャッシュされている行を再読み取りする必要はありません。これが、同じ Id 値を持つすべての値が Field_1 と Field_2 に対して同じ値を持つ理由です。

おそらく、ビューに ROW_NUMBER() フィールドを追加して、それを識別子としてマップできます。

于 2012-06-21T19:53:39.150 に答える
2

ビューは を返さないunique IDため、NHibernate が重複した Id を確認すると、行が最初のレベルのキャッシュにあるため、既にハイドレートされていると見なされます。したがって、同じ重複した行を返すだけです。そのため、動作が見られ1, Green, Blue1, Green, Blue

次の 2 つのオプションがあります。

  1. あなたのビューでは、表2の一意のIDである一意のIDを返しますが、スキーマから判断すると、それは不可能に見えます

  2. ビュー マップ クラスでオーバーライドする必要がありますequals。詳細については、このブログを参照してください。GetHashCode

于 2012-06-21T19:51:59.290 に答える