【问题标题】:HasMany relation inside a Join Mapping连接映射中的 HasMany 关系
【发布时间】:2010-03-18 14:17:19
【问题描述】:

所以,我在流畅的 nhibernate 中映射时遇到问题。我想使用连接映射来展平中间表:这是我的结构:

[Vehicle]
VehicleId
...

[DTVehicleValueRange]
VehicleId
DTVehicleValueRangeId
AverageValue
...

[DTValueRange]
DTVehicleValueRangeId
RangeMin
RangeMax
RangeValue

请注意,DTValueRange 没有 VehicleID。我想将 DTVehicleValueRange 展平到我的 Vehicle 类中。 Tgis 适用于 AverageValue,因为它只是一个普通值,但我似乎无法正确映射 ValueRange 集合。

    public VehicleMap()
    {
        Id(x => x.Id, "VehicleId");
        Join("DTVehicleValueRange", x =>
        {
            x.Optional();
            x.KeyColumn("VehicleId");
            x.Map(y => y.AverageValue).ReadOnly();
            x.HasMany(y => y.ValueRanges).KeyColumn("DTVehicleValueRangeId"); // This Guy
        });
    }

如果 HasMany 映射位于 Join 内部,它似乎不会做任何事情。如果它在 Join 之外并且我指定了表,它会映射,但 nhibernate 会尝试使用 VehicleID,而不是 DTVehicleValueRangeId。

我做错了什么?

【问题讨论】:

  • 我和其他人(groups.google.com/group/fluent-nhibernate/browse_thread/thread/…)也遇到了同样的问题。你找到解决方案了吗?
  • 没有。我得到的最好的结果是“这不是你应该使用 NHibernate 的方式”。我的理解是它将一个表映射到多个对象,但不会将一个对象映射到多个表。 (或者至少不存在对此的支持。)从那时起我已经切换了项目,并且目前没有使用 NHibernate,所以我的信息可能已经过时了。
  • 这个问题也让我很困惑。真的让我头疼。

标签: fluent-nhibernate join nhibernate-mapping


【解决方案1】:

您能解释一下DTVehicleValueRange 表中的平均值列吗?这不是计算出来的值吗(即不需要持久化)?

看起来Vehicle 和DTValueRange 之间存在多对多关系,这当然不会通过连接映射,而是通过HasManyToMany 调用。

【讨论】:

  • DTVehicleValueRange 是从另一个数据源中提取的;我们无法在运行时访问源值,因此我们确实保留了平均值。由于基值每季度更新一次,因此没有实时要求。 Vehicle 到 DTValueRange 被映射为多对多,但实际上,始终存在一对一的关系。 (我知道不建议这样做。)
【解决方案2】:

今天使用地图创建视图时遇到了类似的问题。生成的 SQL 显示它尝试根据 ParentThing 的 Id 而不是 WorkThing 的连接内执行 HasMany(您遇到的问题相同)

经过大量的从头到脚的映射,结果证明将 propertyref 添加到 hasmany 上解决了它。

public class ThingMap : ClassMap<WorkThingView> { 
     public ThingMap() {
                ReadOnly();
                Table("ParentThing");
                Id(x => x.ParentThingId);
                Map(x => x.ParentName);
                Join("WorkThing", join => {
                    join.KeyColumn("ParentThingId");
                    join.Map(m => m.FooCode);
                    join.Map(m => m.BarCode);
                    join.Map(x => x.WorkThingId);
                    join.HasMany(x => x.WorkThingCodes)
                        .Table("WorkThingCode").KeyColumn("WorkThingId").PropertyRef("WorkThingId")
                        .Element("WorkThingCode");
                });
            }
}

【讨论】:

    猜你喜欢
    • 2014-04-25
    • 2016-07-21
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2012-04-03
    • 2016-06-13
    相关资源
    最近更新 更多