【发布时间】:2012-05-16 13:25:42
【问题描述】:
我有一个从其他几个实体引用的实体/类/表,我使用 Fluent NHibernate 为我处理 ORM。在少数情况下,这是一个简单的引用,我可以将外键 ID 存储为列并以这种简单的方式处理引用,但在其他一些情况下,我需要引用这些项目的列表,并且需要完成我能想到的至少三门课。您可以假设将复制此设置以处理其他类的关系。
公共实体的外观如下(HasManys 中的几个其他实体拥有的实体):
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();
})
问题是当我尝试加载ShopCourses 的列表时,我得到了 Fluent 错误:
外键(ABC123AF9:Student [ShopCourseId, StudentId])必须有 与引用的主键相同的列数(ShopCourses [编号])
我不覆盖 Fluent 的 Student 映射,因为它很简单。就本示例而言,Student 不需要知道它属于哪个 ShopCourses,或者可能拥有该特定 Student 记录的任何其他课程。
这似乎是我在做一些基本的错误 - 它到底是什么?提前很多义务!
【问题讨论】:
标签: asp.net-mvc nhibernate fluent-nhibernate automapper