【问题标题】:Many-to-one with formula多对一公式
【发布时间】:2026-01-19 16:25:01
【问题描述】:

我有一个 NHibernate 映射文件,我想将其转换为 fluent。我被这个特殊情况困住了:

<many-to-one name="LastChildRevision" update="false" not-found="ignore" access="readonly" fetch="join">
    <formula>(SELECT TOP(1) CHILD_REVISION.CHILD_REVISION_ID FROM CHILD_REVISION WHERE CHILD_REVISION.PARENT_ID = PARENT_ID ORDER BY CHILD_REVISION.REVISION_NUMBER DESC)</formula>
</many-to-one>

我的班级有:

public virtual IList<ChildRevision> ChildRevisions { get; set; }

public virtual ChildRevision LastChildRevision
{
    get
    {
        return this.ChildRevisions.OrderBy(o => o.RevisionNumber).LastOrDefault();
    } 
}

如何将其翻译为 Fluent NHibernate?当我尝试这个时:

References(x => x.LastChildRevision)
    .Formula("(SELECT TOP(1) CHILD_REVISION.CHILD_REVISION_ID FROM CHILD_REVISION WHERE CHILD_REVISION.PARENT_ID = PARENT_ID ORDER BY CHILD_REVISION.REVISION_NUMBER DESC)")
    .Access
    .ReadOnly()
    .Fetch
    .Join();

我明白了:

Invalid column name 'LastChildRevision_id'.

谢谢!

【问题讨论】:

    标签: fluent-nhibernate fluent-nhibernate-mapping


    【解决方案1】:

    我知道我很久以前就问过这个问题,但我决定重新审视 Fluent NHibernate,这就是我想出的:

    References(x => x.LastChildRevision)
        .Column("PARENT_ID")
        .Not.Insert()
        .Not.Update()
        .Access.ReadOnly()
        .NotFound.Ignore()
        .Cascade.None()
        .Formula("(SELECT TOP(1) CHILD_REVISION.CHILD_REVISION_ID FROM CHILD_REVISION WHERE CHILD_REVISION.PARENT_ID = PARENT_ID ORDER BY CHILD_REVISION.REVISION_NUMBER DESC)");
    

    【讨论】:

      【解决方案2】:

      有一个你可能会遇到的错误。尝试先清除列

      References(x => x.LastChildRevision)
          .Columns.Clear()
          .Formula("(SELEC ...
      

      【讨论】: