C# 如何使用FluentNhibernate连接三个表

C# 如何使用FluentNhibernate连接三个表,c#,fluent-nhibernate,fluent-nhibernate-mapping,C#,Fluent Nhibernate,Fluent Nhibernate Mapping,我将FluentNhibernate用于我的C#应用程序,我想知道如何连接三个没有定义外键的表。假设我有下面的表结构 学生[StudentID,名称1,名称2,ClassID] 班级[ClassID、姓名、学号] 学校[学校ID,学校名称] 我需要像这样连接以上三个表 SELECT a.Name1,a.Name2,b.Name,c.SchoolName FROM Student a, Class b, School c WHERE a.ClassID = b.ClassID AND b.Scho

我将FluentNhibernate用于我的C#应用程序,我想知道如何连接三个没有定义外键的表。假设我有下面的表结构

学生[StudentID,名称1,名称2,ClassID]

班级[ClassID、姓名、学号]

学校[学校ID,学校名称]

我需要像这样连接以上三个表

SELECT a.Name1,a.Name2,b.Name,c.SchoolName FROM Student a, Class b, School c WHERE a.ClassID = b.ClassID AND b.SchoolID = c.SchoolID
我有以下ORM的类结构

public class Student
{
        public virtual int      StudentID { get; set; }
        public virtual string   Name1 { get; set; }
        public virtual string   Name2 { get; set; }
        public virtual int      ClassID  { get; set; }
 }



 public class StudentMap : ClassMap<Student>
    {
        public StudentMap()
        {
            Id(x => x.StudentID ).Column("student_id");
            Map(x => x.Name1 ).Column("name_1");
            Map(x => x.Name1 ).Column("name_2");
            Map(x => x.ClassID).Column("class_Id");
            Table("student");
        }
    }





public class Classt
{
        public virtual int      ClassID { get; set; }
        public virtual string   Name { get; set; }
        public virtual int      SchoolID  { get; set; }
 }



 public class ClassMap : ClassMap<Class>
    {
        public ClassMap ()
        {
            Id(x => x.ClassID ).Column("class_id");
            Map(x => x.Name ).Column("name");
            Map(x => x.SchoolID).Column("school_Id");
            Table("class");
        }
    }




public class School
{
        public virtual int      SchooID { get; set; }
        public virtual string   Name { get; set; }
 }



 public class SchoolMap : ClassMap<School>
    {
        public SchoolMap ()
        {
            Id(x => x.ClassID ).Column("class_id");
            Map(x => x.Name ).Column("name");
            Table("school");
        }
    }
公共班级学生
{
公共虚拟int StudentID{get;set;}
公共虚拟字符串名称1{get;set;}
公共虚拟字符串名称2{get;set;}
公共虚拟整数ClassID{get;set;}
}
公共班级学生地图:班级地图
{
公共学生地图()
{
Id(x=>x.StudentID).列(“学生Id”);
Map(x=>x.Name1).Column(“name_1”);
Map(x=>x.Name1).Column(“name_2”);
Map(x=>x.ClassID).Column(“class_Id”);
表(“学生”);
}
}
公共类
{
公共虚拟整数ClassID{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟int SchoolID{get;set;}
}
公共类类映射:类映射
{
公共类映射()
{
Id(x=>x.ClassID).列(“class_Id”);
映射(x=>x.Name).Column(“Name”);
Map(x=>x.SchoolID).Column(“school_Id”);
表(“类别”);
}
}
公立学校
{
公共虚拟整数SchooID{get;set;}
公共虚拟字符串名称{get;set;}
}
公共班级学校地图:班级地图
{
公共学校地图()
{
Id(x=>x.ClassID).列(“class_Id”);
映射(x=>x.Name).Column(“Name”);
表(“学校”);
}
}

你应该这样做

public class Student
{
        public virtual int      StudentID { get; set; }
        public virtual string   Name1 { get; set; }
        public virtual string   Name2 { get; set; }
        public virtual List<Class> ClassList  { get; set; }
}

public class StudentMap : ClassMap<Student>
{
    public StudentMap()
    {
        Id(x => x.StudentID ).Column("student_id");
        Map(x => x.Name1 ).Column("name_1");
        Map(x => x.Name1 ).Column("name_2");
        HasMany(x => x.Class).KeyColumn("ClassId")
        Table("student");
    }
}

public class Class
{
        public virtual int      ClassID { get; set; }
        public virtual string   Name { get; set; }
        public virtual IList<Student> StudentList { get; set; }
        public virtual School School  { get; set; }
}

public class ClassMap : ClassMap<Class>
{
    public ClassMap ()
    {
        Id(x => x.ClassID ).Column("class_id");
        Map(x => x.Name ).Column("name");
        HasMany(x => x.Student).KeyColumn("StudentId")
        References(x => x.School)
        Table("class");
    }
}

public class School
{
    public virtual int      SchoolID { get; set; }
    public virtual string   Name { get; set; }
    public virtual IList<Class> ClassList { get; set; }
}

public class SchoolMap : ClassMap<School>
{
    public SchoolMap ()
    {
        Id(x => x.SchoolID ).Column("SchoolId");
        Map(x => x.Name ).Column("name");
        HasMany(x => x.ClassList).KeyColumn("ClassId")
        Table("school");
    }
}
公共班级学生
{
公共虚拟int StudentID{get;set;}
公共虚拟字符串名称1{get;set;}
公共虚拟字符串名称2{get;set;}
公共虚拟列表类列表{get;set;}
}
公共班级学生地图:班级地图
{
公共学生地图()
{
Id(x=>x.StudentID).列(“学生Id”);
Map(x=>x.Name1).Column(“name_1”);
Map(x=>x.Name1).Column(“name_2”);
HasMany(x=>x.Class).KeyColumn(“ClassId”)
表(“学生”);
}
}
公共课
{
公共虚拟整数ClassID{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList学生列表{get;set;}
公共虚拟学校{get;set;}
}
公共类类映射:类映射
{
公共类映射()
{
Id(x=>x.ClassID).列(“class_Id”);
映射(x=>x.Name).Column(“Name”);
HasMany(x=>x.Student).KeyColumn(“StudentId”)
参考文献(x=>x.School)
表(“类别”);
}
}
公立学校
{
公共虚拟int SchoolID{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟IList类列表{get;set;}
}
公共班级学校地图:班级地图
{
公共学校地图()
{
Id(x=>x.SchoolID).列(“SchoolID”);
映射(x=>x.Name).Column(“Name”);
HasMany(x=>x.ClassList).KeyColumn(“ClassId”)
表(“学校”);
}
}

为什么您的实体之间没有联盟?如果不使用对象之间的任何关系,那么使用ORM有什么意义呢?谢谢你的回答Mert,查询是什么样子的?你想实现什么,nhibernate是面向对象的。你返回的对象是什么?我的意思是,如果我想得到特定的学生对象,我会得到如下
code
var user=session.CreateCriteria(“st”).Add(Restrictions.Eq(“st.StudentId”,login)).UniqueResult()
code
像这样我如何执行下面的内容加入FluentNhibernate并使用您建议的文件结构
code
从学生a的b班中选择a.Name1、a.Name2、b.Name、c.SchoolName,School c其中a.ClassID=b.ClassID和b.School ID=c.School ID
code
Hi-Mert,我终于想出了以下解决方案,但它总是返回单个对象,我需要返回对象列表请让我知道你是否知道答案[link]我相信是你的连接映射导致了这一点,请删除它,然后再试一次,它应该会得到所有学生。