C# 如何使用FluentNhibernate连接三个表
我将FluentNhibernate用于我的C#应用程序,我想知道如何连接三个没有定义外键的表。假设我有下面的表结构 学生[StudentID,名称1,名称2,ClassID] 班级[ClassID、姓名、学号] 学校[学校ID,学校名称] 我需要像这样连接以上三个表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
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 IDcode
Hi-Mert,我终于想出了以下解决方案,但它总是返回单个对象,我需要返回对象列表请让我知道你是否知道答案[link]我相信是你的连接映射导致了这一点,请删除它,然后再试一次,它应该会得到所有学生。