【问题标题】:Map int to bool in NHibernate using a second table as data source在 NHibernate 中使用第二个表作为数据源将 int 映射到 bool
【发布时间】:2011-12-07 19:08:10
【问题描述】:

我正在尝试制作一张我不知道 NHibernate 是否支持的地图。

我有一个表 A,我在 Fluent NHibernate 中有一个映射。 我有另一个名为 B 的表,我必须在其中搜索 A.Id 。如果我在此表中找到此 ID,则必须将类 A 的映射中的 bool 属性设置为 true,否则设置为 false。

在表 A 和表 B 之间,使用 HasOne 方法在映射中表示一对一的关系。 问题是 HasOne 没有可用于将结果转换为 bool 属性的 CustomType 方法。

我也可以从映射中将值转换为位或整数,但我不知道该怎么做。

有谁知道这是否可行,如果可以,怎么做?

谢谢你,摩苏。

【问题讨论】:

    标签: .net nhibernate fluent-nhibernate mapping has-one


    【解决方案1】:

    为这种情况制定了公式

    Map(x => x.BooleanProperty).Formula("SELECT true IF EXISTS (SELECT 1 FROM B WHERE B.A_id = Id)");
    

    编辑:

    另一种方法(未测试)

    // public AMap()
    Join("TableB", join =>
    {
        join.KeyColumn("A_id");
        join.Optional();
        Map(x => x.BooleanPropery, "someBcolumn").Not.Insert().Not.Update().CustomType<NullToFalseElseTrue>();
    });
    
    // class A
    public virtual bool BooleanPropery { get; private set; }
    

    【讨论】:

    • 感谢您的回答。我试图避免在源代码中使用 SQL。有其他解决方案吗?我知道尝试使用受保护的成员并在将返回 bool 值的方法中使用其值。
    • 在第二种方法中,我无法在选择中获取列,因此无法在 CustomType 中转换它(我得到 A.Id,但我也需要 B.Id)。我正在使用你的语法。你知道我做错了什么吗?
    • 您不能将 b.id 作为 booleanproperty 的列吗?
    • 我将 b.id 列提供给 booleanproperty,但我没有在结果集中得到 b.id 列。不知道为什么。明天早上我会进一步调查。谢谢!
    【解决方案2】:

    Firo 提供了正确的答案。 然而,它的代码存在一个小问题,所以我也在回答我的问题以获得更多的可见性(而不是作为评论)。

    Join("TableB", join =>
    {
        join.KeyColumn("A_id");
        join.Optional();
        join.Map(x => x.BooleanPropery, "someBcolumn").Not.Insert().Not.Update().CustomType<NullToFalseElseTrue>();
    }); 
    

    差异很小但很重要。 如果没有 Join 委托的第三行缺少的“join”,您就是在告诉 NHibernate,您正在将 A_ID 列映射到 BooleanProperty 而不是 B_Id,正如您所期望的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2020-05-13
      • 1970-01-01
      相关资源
      最近更新 更多