流利的Nhibernate:映射问题

时间:2011-03-10 02:47:22

标签: fluent-nhibernate

我对Fluent Nhibernate非常陌生。我陷入了这种情况。 有关它的详细信息,请参阅。

我们的表结构就像

  

表学生{Student_Id,姓名}
    表学校{School_Id,Name}
    表LinkTable {School_Id,Student_Id}

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

关系就像 1)一名学生可以成为0或1所学校的一部分。 2)一所学校可以容纳许多学生。

任何人都可以告诉我如何为每个文件进行映射吗?

或者让mw知道以下映射文件有什么问题

现在,它给我一个错误,即在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");
}

谢谢, 马赫什

2 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:1)

如果学生只能与0或1所学校相关联,那么您可以考虑删除LinkTable和SchoolStudent课程,只需将School_Id添加到Student表中,并在Student课程中添加对School的引用。

然后你的映射就像:

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();
}