2011-03-10 48 views
0

我对Fluent Nhibernate非常陌生。我陷入了这种情况。 请查阅下面的细节。Fluent Nhibernate:Mapping问题

我们的表结构是这样的

表学生{student_id数据,名称}
表学校{学校ID,名称}
表LinkTable {学校ID,student_id数据}

LinkTable只包含学生和学校的ID。 [复合键]

关系就像 1)一个学生可以是0或1学校的一部分。 2)一所学校可以包含很多学生。

任何人都可以让我知道如何为每个文件做映射吗?

或让兆瓦知道什么现在是错误的下面的映射文件

,它给我的错误是学生物业不SchoolStudent找到。

public Student() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name); 
    HasOne(x => x.SchoolStudent).PropertyRef(r => r.Student); 
} 

public School() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name); 
    HasMany(x => x.SchoolStudent).KeyColumn("School_Id").Inverse().Cascade.AllDeleteOrphan(); 
} 

public SchoolStudent() 
{ 
    CompositeId().KeyReference(x => x.School, "School_Id") 
      .KeyReference(x => x.Student, "Student_Id"); 
} 

感谢, 马赫什

回答

1

我将它重新写这样的事:

Student.cs

public class Student 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<School> Schools { get; set; } 

    public Student() 
    { 
     Schools = new List<School>(); 
    } 
} 

School.cs

public class School 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Student> Students { get; set; } 

    public School() 
    { 
     Students = new List<Student>(); 
    } 
} 

StudentMap.cs

public class StudentMap : ClassMap<Student> 
{ 
    public Student() 
    { 
     Id(x => x.Id , "Student_Id"); 
     Map(x => x.Name , "Name"); 

     HasManyToMany(x => x.Schools).Table("LinkTable") 
            .ParentKeyColumn("Student_Id") 
            .ChildKeyColumn("School_Id"); 
    } 
} 

SchoolMap.cs

public class SchoolMap: ClassMap<School> 
{ 
    public School() 
    { 
     Id(x => x.Id , "School_Id"); 
     Map(x => x.Name , "Name"); 

     HasManyToMany(x => x.Students).Table("LinkTable") 
             .ParentKeyColumn("School_Id") 
             .ChildKeyColumn("Student_Id"); 
    } 
} 
+0

适合饲养许多对许多链接表。我质疑是否需要。如前所述,一个学生只能有一所学校或没有多少学校。 – 2011-03-15 01:43:21

+0

我想我对LinkTable表格感到困惑,该表格允许一个学生拥有很多学校(尽管如此,很难想象这一点)。 – 2011-03-15 21:38:03

1

如果一个学生只能有0或1所学校有关,那么你可以考虑删除的LinkTable和SchoolStudent班级,只需将School_Id添加到学生表,并参考学生班的学校。

然后你的映射是这样的:

public Student() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name); 
    References(x => x.School); 
} 

public School() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name); 
    HasMany(x => x.Student).Inverse().Cascade.AllDeleteOrphan(); 
}