5

我有一个具有N:1父子关系的架构,该架构存储在另一个表中并由公式选择。是否可以使用公式将此实体映射到父级?

public class ParentEntity {
    public virtual int ParentId { get; set; }
    public virtual ChildEntity Child{ get; set; }
}


public class ParentMapping : ClassMap<ParentEntity> {
    public ParentMapping() {
        Table("ParentTable");

        Id(x => x.ParentId).Column("ParentId").GeneratedBy.Assigned().Not.Nullable();
        References<ChildEntity>(x => x.Child).Formula(
            @"(
                SELECT TOP 1 ChildTable.ChildId
                FROM ChildTable
                WHERE ChildTable.ParentId = ParentId
            )"
        );
    }
}

此映射生成的 SQL 如下所示:

SELECT
    this_.ParentId,
    this_.ChildEntity_id
FROM ParentTable this_ 

这不是我要找的。

如何引用此子实体并使用从ChildId公式中选择的公式,而不是在父表中ChildId

4

1 回答 1

4

无论如何我不会讨论这种方法的正确性,只是尝试回答。您正在尝试做的事情: 应该工作。我已经在测试场景中检查了公式的正确性。所以,是的,公式可以完全这样使用。

但因为它不起作用,我会有点猜测。让我们从我的测试用例中生成的 SQL 开始,它正在工作。

SELECT this_.ParentId as ParentId3_0_
, (SELECT TOP 1 Child.ChildId
     FROM Child
     WHERE Child.ParentId = this_.ParentId) as formula1_0_ 
FROM Parent this_

可能的问题

我看到两个可能的问题

1.不同的Child ID列名

首先在您的代码段中:

References<ChildEntity>(x => x.Child).Formula(
            @"(
                SELECT TOP 1 ChildTable.ChildId
                FROM ChildTable
                WHERE ChildTable.ParentId = ParentId
            )"

是子主键的列名:ChildId而在 SQL 片段中是ChildEntity_id

SELECT
    this_.ParentId,
    this_.ChildEntity_id
FROM ParentTable this_ 

2. SQL Snippet 不匹配

其次,您提到(上面的 SQL 语句)是生成的。但它更像是这个映射的一个声明:

References<ChildEntity>(x => x.Child).Column("ChildEntity_id")

所以不能有一些旧的/其他的映射,实际上是使用的吗?

总结 我想说的是,这种映射方式是有效的。所以你在正确的轨道上,但魔鬼隐藏在细节中;)

于 2012-11-09T08:36:51.683 回答