我有一个实体/类/表,它是从其他几个实体引用的,我使用Fluent NHibernate为我处理ORM。在一些实例中,它是一个简单的引用,我可以将外键ID存储为列并以这种简单的方式处理引用,但在其他一些实例中,我需要引用这些项的列表,并且需要完成至少我能想到的三个班级。您可以假设将复制此设置以处理其他类的关系。
以下是公共实体的外观(由HasMany
中的其他几个实体拥有的实体):
public class Student {
public virtual int Id {get; set;}
public virtual string Name {get; set;}
}
而且,这是ShopCourse
实体的样子:
public class ShopCourse {
public virtual int Id {get; set;}
public virtual int Name {get; set;}
public virtual IList<Student> Students {get; set;}
}
想象一下,我所拥有的其他几门课程,如特定课程,可以“拥有”几个学生。为了维护这种关系,我必须在我的数据库中创建一个跟踪两者之间的外键的表(对于引用Student
的每个实体) - 这个中间表不需要实体,而Fluent不需要想到它,除非我把它本身的字符串名称交给它:
表:ShopCourseStudents
int - ShopCourseId
int - StudentId
最后,这是我的映射。您可以假设实体本身映射得很好 - 诸如Id的命名方案之类的事情已经解决并且正常工作。当我尝试初始化HasMany
Student
的任何实体时,问题在于:
//Inside a FluentlyConfigure().Mappings(m => m.AutoMappings.Add() call:
.Override<ShopCourse>(map => {
map.HasMany(x => x.Students)
.Table("ShopCourseStudents")
.KeyColumns.Add("ShopCourseId")
.KeyColumns.Add("StudentId")
.Cascade.All();
})
问题在于,当我尝试加载ShopCourse
的列表时,我收到了Fluent错误:
外键(ABC123AF9:学生[ShopCourseId,StudentId])必须有 与引用的主键相同的列数(ShopCourses [ID])
我不覆盖Fluent的Student
映射,因为它很简单。出于此示例的目的,Student
不需要知道它属于哪个ShopCourse
,或者可能拥有该特定Student
记录的任何其他课程。
这似乎是我在做一些基本的,错误的 - 它究竟是什么?事先有很多责任!
答案 0 :(得分:0)
所以,问题在于我在我的项目中重复使用的自定义代码,显然,为处理ManyToMany约定而编写的部分大部分已被破坏。我在这里寻找的是ManyToMany
关系,而不是HasMany
。我遇到的问题是我的代码强制对子对象(在本例中为Student
)强制引用父对象,这是我不需要的,只会使事情变得复杂。删除它,我的ManyToMany
然后工作:
.Override<ShopCourse>(map => {
map.HasManyToMany(x => x.Students)
.Table("ShopCourseStudents")
.ParentKeyColumn("ShopCourseId")
.ChildKeyColumn("StudentId")
.Cascade.All()