流利的Nhibernate可以从几个表中找到一个表

时间:2012-05-16 13:25:43

标签: asp.net-mvc nhibernate fluent-nhibernate automapper

我有一个实体/类/表,它是从其他几个实体引用的,我使用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记录的任何其他课程。

这似乎是我在做一些基本的,错误的 - 它究竟是什么?事先有很多责任!

1 个答案:

答案 0 :(得分:0)

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

.Override<ShopCourse>(map => {
    map.HasManyToMany(x => x.Students)
        .Table("ShopCourseStudents")
        .ParentKeyColumn("ShopCourseId")
        .ChildKeyColumn("StudentId")
        .Cascade.All()