NHibenate:有没有办法用复合键创建一对多的双向关系?

NHibenate: Is there a way to create a one to many bidirectional relationship with composite keys?

我正在尝试在 2 类 上的 NHibernate 中设置双向一对多关系,两者都具有重叠的复合键。 另一个困难是我不能只编辑 SQL 表来添加适当的 ID。

这可能是个简单的问题,但我找不到答案。

据我所知,我已经下载了 HasMany。但我坚持使用 HasOne。也尝试参考。

public class Parent
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public List<Child> Children { get; set; }
    public string Data { get; set; }
}
public class Child
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
    public Parent Parent { get; set; }
    public string Data { get; set; }
}

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        CompositeId()
            .KeyProperty(x => x.A)
            .KeyProperty(x => x.B)
            .KeyProperty(x => x.C);
        Map(x => x.Data);
        HasMany(x => x.Children)
                .KeyColumn("A")
                .KeyColumn("B")
                .KeyColumn("C");
    }
}
public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        CompositeId()
            .KeyProperty(x => x.A)
            .KeyProperty(x => x.B)
            .KeyProperty(x => x.C)
            .KeyProperty(x => x.D);
        Map(x => x.Data);
        HasOne(x => x.Parent);
        // also tried
        //References<Parent>(x => x.Parent)
                //.Columns("A", "B", "C");
    }
}

我现在得到的错误是: NHibernate.FKUnmatchingColumnsException: 'Foreign key (FK_3346D8AD:Child [C])) must have same number of columns as the referenced primary key (Parent [A, B, C])'

抱歉,我不太了解 nhibernate,但总的来说,关于您的 Child.Parent 属性 映射 - one-to-one (HasOne) 在这里不是正确的映射。 One-to-one 映射仅在 Id 对两个实体相同时才有效。所以 ChildParent 都应该是 [A, B, C]。

但是 many-to-one 映射 (References) 应该可以工作 - 您只需要将所有引用的列或 属性 标记为只读(您需要找到 [=18= 的流畅等价物] 在 hbm.xml) 中,因为这些列已经是您的 ID 映射的一部分。在 hbm.xml 中,映射如下所示:

<many-to-one name="Parent" insert="false" update="false" not-null="true">
    <column name="A"/>
    <column name="B"/>
    <column name="C"/>
</many-to-one>

所以在流畅的 nhibernate 中它应该看起来像:

References<Parent>(x => x.Parent).Columns("A", "B", "C")
//Not sure if it exists
.Readonly(); 
//Or something like this
.Insert(false).Update(false);

问题是:

HasMany(x => x.Children)
    .KeyColumn("A")
    .KeyColumn("B")
    .KeyColumn("C");

应该是什么:

HasMany(x => x.Children)
    .KeyColumns.AddRange("A", "B", "C");