我有一个从其他几个实体引用的实体/类/表,我使用 Fluent NHibernate 为我处理 ORM。在少数情况下,这是一个简单的引用,我可以将外键 ID 存储为列并以这种简单的方式处理引用,但在其他一些情况下,我需要引用这些项目的列表,并且需要完成我能想到的至少三门课。您可以假设将复制此设置以处理其他类的关系。
以下是公共实体的外观(由 s 中的其他几个实体拥有的实体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
)——这个中间表不需要实体,除非我将表本身的字符串名称交给它:
表:ShopCourse学生
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
s 列表时,我得到了 Fluent 错误:
外键 (ABC123AF9:Student [ShopCourseId, StudentId]) 的列数必须与引用的主键 (ShopCourses [Id]) 相同
我不会覆盖 Fluent 的映射,Student
因为它很简单。出于本示例的目的,Student
不需要知道ShopCourse
它属于哪个 s,或者可能拥有该特定Student
记录的任何其他课程。
这似乎是我在做一些基本的、错误的事情——到底是什么?非常有义务提前!