3

我有两张桌子和一个视图:

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

您的视图没有返回 aunique ID因此,当 NHibernate 看到重复的 Id 时,它已经认为该行已被水合,因为它在一级缓存中。因此它只返回相同的重复行,这就是您看到该行为的1, Green, Blue原因1, Green, Blue

你有两个选择:-

  1. 在您看来,返回一个唯一 ID,它是表 2 中的唯一 ID,尽管根据您的架构判断,这看起来不可能

  2. 您需要覆盖equalsGetHashCode在您的视图地图类中,请参阅此博客以获取更多信息。

于 2012-06-21T19:51:59.290 回答
2

您将 Id 列映射为 Identifier 字段,因此 NHibernate 的第一级缓存不会费心重新读取它已经缓存的行。这就是为什么具有相同 Id 值的所有值对于 Field_1 和 Field_2 具有相同的值。

也许您可以在视图中添加一个 ROW_NUMBER() 字段并将其映射为标识符。

于 2012-06-21T19:53:39.150 回答