Fluent Nhibernate 映射/连接
Fluent Nhibernate mappings / Join
在我的代码中,我有三个主要实体:
一、公司
2. 工作人员
3.位置
A staff can have several positions in various companies.
我想检索与特定公司关联的所有员工。
在代码中我会做类似的事情:
public partial class Company
{
public virtual IEnumerable<Position> Positions { get; protected set; }
public virtual IEnumerable<Staff> Staffs
{
get { return Positions.Select(x => x.Staff); }
}
}
class CompanyMap : ClassMap<Company>
{
public CompanyMap()
{
Id(x => x.Id)
.Column("CompanyId")
.GeneratedBy.Identity();
Map(x => x.Name)
.Not.Nullable();
HasMany(x => x.Positions)
.KeyColumn("CompanyId")
.AsBag();
}
}
Pb:在这个解决方案中,我将加载与公司相关的所有职位,然后加载与每个职位相关的所有员工...就性能而言,我想它不是很好...
我很确定有更好的方法可以直接在 CompanyMap 中执行此连接 class。
你能帮我做吗?
谢谢,
塞巴斯蒂安
改变数据模型如何? Staff
似乎总是在给定 Company
级别的给定 Position
集合中。这建议以下模型
public partial class Staff
{
public virtual IEnumerable<CompanyPosition> Positions { get; protected set; }
}
public class Position
{
//...
}
public class Company
{
//...
}
public class CompanyPosition
{
public virtual Company Company {get;set;}
public virtual IEnumerable<Position> {get;set;}
}
有了它,您可以直接进行映射,您的查询结果类似于此
var data = session.Query<Staff>().Where(s=>s.CompanyPosition.Company == company);
在我的代码中,我有三个主要实体: 一、公司 2. 工作人员 3.位置
A staff can have several positions in various companies.
我想检索与特定公司关联的所有员工。
在代码中我会做类似的事情:
public partial class Company
{
public virtual IEnumerable<Position> Positions { get; protected set; }
public virtual IEnumerable<Staff> Staffs
{
get { return Positions.Select(x => x.Staff); }
}
}
class CompanyMap : ClassMap<Company>
{
public CompanyMap()
{
Id(x => x.Id)
.Column("CompanyId")
.GeneratedBy.Identity();
Map(x => x.Name)
.Not.Nullable();
HasMany(x => x.Positions)
.KeyColumn("CompanyId")
.AsBag();
}
}
Pb:在这个解决方案中,我将加载与公司相关的所有职位,然后加载与每个职位相关的所有员工...就性能而言,我想它不是很好...
我很确定有更好的方法可以直接在 CompanyMap 中执行此连接 class。
你能帮我做吗?
谢谢, 塞巴斯蒂安
改变数据模型如何? Staff
似乎总是在给定 Company
级别的给定 Position
集合中。这建议以下模型
public partial class Staff
{
public virtual IEnumerable<CompanyPosition> Positions { get; protected set; }
}
public class Position
{
//...
}
public class Company
{
//...
}
public class CompanyPosition
{
public virtual Company Company {get;set;}
public virtual IEnumerable<Position> {get;set;}
}
有了它,您可以直接进行映射,您的查询结果类似于此
var data = session.Query<Staff>().Where(s=>s.CompanyPosition.Company == company);