使用 Fluent NHibernate 对复合键的问题映射参考
Problem mapping reference to composite key with Fluent NHibernate
- 我有一个名为..."ClassA" 的 class,它有一个 int ID 作为主键。
- 我有一个名为 "ClassB" 的 class,它有一个复合主键,由一个 Id、一个引用 ClassA 的 ClassAId 和另一个名为 Version 的整数构成。
- 我有一个名为 C 的 class,它有一个作为主键的 int ID,以及一个由 ClassBId、ClassAId 和 Version 组成的 ClassB 的外键。
我找不到用 Fluent NHibernate 映射它的方法。
我的 class 定义是这样的-我将省略 Equals 和 GetHash 部分-:
public class ClassA
{
public virtual int Id { get; set; }
}
public class ClassB
{
public virtual int Id { get; set; }
public virtual ClassA ClassA { get; set; }
public virtual ICollection<ClassC> ClassCCollection { get; set; }
}
public class ClassC
{
public virtual int Id { get; set; }
public virtual ClassB ClassB { get; set; }
}
还有我的映射构造函数:
public ClassAMap()
{
Table("ClassA");
Id(c => c.Id);
}
public ClassBMap()
{
Table("ClassB");
CompositeId()
.KeyProperty(c => c.Id)
.KeyReference(c => c.ClassA, "ClassAId")
.KeyProperty(c => c.Version);
HasMany(c => c.Edges)
.Inverse()
.Cascade.All().AsList().KeyColumns.Add("ClassBId", "ClassAId", "Version");
}
public ClassCMap()
{
Table("ClassC");
Id(c => c.Id);
References(n => n.ClassB).Columns("ClassBId, ClassAId, Version").Not.Nullable();
}
但是当我尝试启动应用程序时,SchemaUpdate 说
FKUnmatchingColumnsException: Foreign key (FK_6C7456E0:ClassC [ClassBId, ClassAId, Version])) must have same number of columns as the referenced primary key (ClassB [Id, ClassAId, Version])
也许我数学不太好,但似乎 3 列的列数与 3 列的列数相同。我错过了什么吗?
谢谢
非常愚蠢的错误:
我在写
References(n => n.ClassB).Columns("ClassBId, ClassAId, Version").Not.Nullable();
将三列放在同一个字符串中。应该是:
References(n => n.ClassB).Columns("ClassBId", "ClassAId", "Version").Not.Nullable();
一个让我卡了两天的失误。
- 我有一个名为..."ClassA" 的 class,它有一个 int ID 作为主键。
- 我有一个名为 "ClassB" 的 class,它有一个复合主键,由一个 Id、一个引用 ClassA 的 ClassAId 和另一个名为 Version 的整数构成。
- 我有一个名为 C 的 class,它有一个作为主键的 int ID,以及一个由 ClassBId、ClassAId 和 Version 组成的 ClassB 的外键。
我找不到用 Fluent NHibernate 映射它的方法。
我的 class 定义是这样的-我将省略 Equals 和 GetHash 部分-:
public class ClassA
{
public virtual int Id { get; set; }
}
public class ClassB
{
public virtual int Id { get; set; }
public virtual ClassA ClassA { get; set; }
public virtual ICollection<ClassC> ClassCCollection { get; set; }
}
public class ClassC
{
public virtual int Id { get; set; }
public virtual ClassB ClassB { get; set; }
}
还有我的映射构造函数:
public ClassAMap()
{
Table("ClassA");
Id(c => c.Id);
}
public ClassBMap()
{
Table("ClassB");
CompositeId()
.KeyProperty(c => c.Id)
.KeyReference(c => c.ClassA, "ClassAId")
.KeyProperty(c => c.Version);
HasMany(c => c.Edges)
.Inverse()
.Cascade.All().AsList().KeyColumns.Add("ClassBId", "ClassAId", "Version");
}
public ClassCMap()
{
Table("ClassC");
Id(c => c.Id);
References(n => n.ClassB).Columns("ClassBId, ClassAId, Version").Not.Nullable();
}
但是当我尝试启动应用程序时,SchemaUpdate 说
FKUnmatchingColumnsException: Foreign key (FK_6C7456E0:ClassC [ClassBId, ClassAId, Version])) must have same number of columns as the referenced primary key (ClassB [Id, ClassAId, Version])
也许我数学不太好,但似乎 3 列的列数与 3 列的列数相同。我错过了什么吗? 谢谢
非常愚蠢的错误:
我在写
References(n => n.ClassB).Columns("ClassBId, ClassAId, Version").Not.Nullable();
将三列放在同一个字符串中。应该是:
References(n => n.ClassB).Columns("ClassBId", "ClassAId", "Version").Not.Nullable();
一个让我卡了两天的失误。