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
对两个实体相同时才有效。所以 Child
和 Parent
都应该是 [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");
我正在尝试在 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
对两个实体相同时才有效。所以 Child
和 Parent
都应该是 [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");