【问题标题】:NHibernate mapping: entity property corresponding to presence of record in another tableNHibernate 映射:实体属性对应于另一个表中记录的存在
【发布时间】:2011-02-28 18:17:32
【问题描述】:

我很确定 NHibernate 可以做什么样的事情,但我想与社区核实一下。

如果我有一个实体 Foo:

public class Foo
{
  public int Id { get; set; }
  public string Name { get; set; }
  public bool HasRegistered { get; set; }
}

如果Actions 表中有相应的记录,我希望属性HasRegistered 为真(即,Foo 的Id 作为外键并且在另一个字段中具有特定代码“BLAH”),如果没有,则为假。

例如,如果Action 记录具有以下字段,则HasRegistered 为真:

  • FooId(等于Foo的Id
  • Code(等于值 'BLAH')

这样的映射可能吗?

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    根据我对 NHibernate 的了解,这对于“透明”映射功能是不可能的,例如 property 或者您可以使用 bags os sets 等等.. 最简单的方法是在该 property 上使用 formula 并使该属性“不可变”,因此该属性确实涉及插入/更新方案。 希望这会有所帮助。

    所以这可能是一个例子:

    <property 
          name="HasRegistered" 
          formula="sql formula to evaluate" 
          insert="false" update="false"/>
    

    作为关于 (property 在这种情况下) 的 nhibernate 映射功能的更多信息来源如下: NHibernate mapping: property

    【讨论】:

    • 据我所知,你刚刚告诉我这是可能的,只要我能以某种方式将实体的 Id 放入 SQL 表达式中(即公式可以是动态的)。
    • 您可以放入公式中的表达式是任意 SQL 表达式(正如我从ayende 提供的链接所说),您可以将 a Select .... from Actions where Actions.Id = Id (Nhibernate 用来自 coulumn 的表名来翻译这个 Id prefixyng )和 Actions.Code = 'BLAH'。这可能是一个例子,另一种方法是用 CASE WHEN 来做,但我认为第一个更好,因为你没有一组值可供选择,但你有一个表达式来评估 IF 有相关记录和如果有那个 CODE VALUE = 'BLAH'
    • 谢谢。关于身份的那一点是我需要知道的。
    • 我映射到的数据库平台(Interbase)不支持 CASE WHEN(嘘!),但确实支持相关子查询(感谢上帝)。
    • 我忽略了你的数据库平台!对不起,我告诉了 CASE WHEN 自动考虑到你在 SQL SERVER 上工作,对不起我的错误!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2011-06-06
    相关资源
    最近更新 更多