我有两个表和一个视图:
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
我认为问题出在View地图中,但我找不到解决方法:(
有人有想法解决?
答案 0 :(得分:2)
你的视图没有返回unique ID
,因此当NHibernate看到重复的Id时,它已经认为该行是水合的,因为它在第一级缓存中。因此,它只返回相同的重复行,这就是您看到行为1, Green, Blue
和1, Green, Blue
您有两种选择: -
会返回一个唯一的ID,这是表2中的唯一ID,尽管根据您的架构判断看起来不可能
您需要覆盖视图地图类中的equals
和GetHashCode
,有关详细信息,请参阅此blog。
答案 1 :(得分:2)
您将Id列映射为Identifier字段,因此NHibernate的第一级缓存无需重新读取已缓存的行。这就是为什么具有相同Id值的所有值对于Field_1和Field_2具有相同的值。
也许您可以在视图中添加ROW_NUMBER()字段并将其映射为标识符。