2012-05-16 21 views
0

我有一个实体/类/表是从其他几个实体引用的,我用Fluent NHibernate来处理ORM给我。在少数情况下,这是一个简单的引用,我可以将外键ID存储为列,并以简单的方式处理引用,但在其他几个实例中,我需要引用这些项目的列表,并且需要完成此操作至少有三个我能想到的课程。你可以假设这个设置将被复制来处理其他类的关系。流利Nhibernate HasMany从几个表中的一个表

下面是常见的实体的外观(由其他几个实体HasMany S投资的一个):

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的命名方案等事情已解决并且正常工作。问题在于,当我尝试初始化有任何实体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(); 
    }) 

的问题是,当我尝试加载的ShopCourse个名单,我得到了流利的错误:

Foreign key (ABC123AF9:Student [ShopCourseId, StudentId]) must have same number of columns as the referenced primary key (ShopCourses [Id])

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

这似乎是我正在做一些基本的,错的 - 它是什么,到底是什么?提前很多!

回答

0

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

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