0

我有一个从其他几个实体引用的实体/类/表,我使用 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 的命名方案之类的事情已解决并正常工作。当我尝试初始化任何具有以下属性的实体时,问题就出HasManyStudent

//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 [Id]) 相同

不会覆盖 Fluent 的映射,Student因为它很简单。出于本示例的目的,Student不需要知道ShopCourse它属于哪个 s,或者可能拥有该特定Student记录的任何其他课程。

这似乎是我在做一些基本的、错误的事情——到底是什么?非常有义务提前!

4

1 回答 1

1

因此,问题在于我在项目中重复使用的自定义代码,显然为处​​理 ManyToMany 约定而编写的部分大部分都被破坏了。我在这里寻找的是一种ManyToMany关系,而不是HasMany。我遇到的问题是我的代码强制将子对象(在本例中为Student)上的引用指向父对象,我不需要而且只会使事情复杂化。删除它,然后我的ManyToMany工作:

.Override<ShopCourse>(map => {
    map.HasManyToMany(x => x.Students)
        .Table("ShopCourseStudents")
        .ParentKeyColumn("ShopCourseId")
        .ChildKeyColumn("StudentId")
        .Cascade.All()
于 2012-05-16T14:48:00.430 回答