asp.net nHibernate从View映射中选择数据

时间:2012-06-21 19:03:52

标签: asp.net nhibernate nhibernate-mapping sybase

我有两个表和一个视图:

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地图中,但我找不到解决方法:(

有人有想法解决?

2 个答案:

答案 0 :(得分:2)

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

的原因

您有两种选择: -

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

  2. 您需要覆盖视图地图类中的equalsGetHashCode,有关详细信息,请参阅此blog

答案 1 :(得分:2)

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

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