C# 如何在Fluent NHibernate中映射不相关(无直接关系)的表
我有以下几张表C# 如何在Fluent NHibernate中映射不相关(无直接关系)的表,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有以下几张表 Car(CarId,Name,…) CarPartLink(CarId,PartId) Part(PartId,Name) 子部件链接(父部件、子部件)其中父部件和子部件都来自部件表 我希望Car对象具有部分的列表,包括子部分,这里Car与其子部分没有直接关系,并且部分与子部分都没有直接关系 i、 e 等级车 { 公共虚拟字符串Id{get;set;} 公共虚拟字符串名称{get;set;} 公共虚拟ICollection AllParts{get;set;}//假设子部分只有一
Car(CarId,Name,…)
CarPartLink(CarId,PartId)
Part(PartId,Name)
子部件链接(父部件、子部件)
其中父部件和子部件都来自部件表Car
对象具有部分的列表,包括子部分
,这里Car
与其子部分
没有直接关系,并且部分
与子部分
都没有直接关系
i、 e
等级车
{
公共虚拟字符串Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟ICollection AllParts{get;set;}//假设子部分只有一级深,则应包括所有部分及其子部分
}
如何在Fluent NHibernate中为相同的对象制作地图
编辑1:
如果在流畅的NHibernate中不可能,但在NHibernate映射中可能,那么我也可以
我使用的是Fluent NHibernate版本:1.4.0.1和NHibernate版本:3.3.3
编辑2:
如果我只得到地图中的子部分,或者子部分的id
,我也很好
编辑3:
每辆车(在本例中称为汽车
)有超过100万个零件
和子零件
组合,其中用户实际使用的零件数为100个,具体取决于条件。e、 g.获取所有重量为100 kg的零件或获取所有类型为“螺钉”的零件等。我将需要只读模式下的这些数据。中已经有一个关于关系映射的详细教程。我建议你读一下指南,或者更好的是,循序渐进。假设以下实体:
public class Car
{
public virtual int CarId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Part> AllParts {get; set;}
public Car()
{
AllParts = new List<Part>();
}
}
public class Part
{
public virtual int PartId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Car> AllCars {get; set;}
//never tried mapping a many-to-many on the same entity, but this should work...
public virtual IList<Part> ParentParts {get; set;}
public virtual IList<Part> SubParts {get; set;}
public Part()
{
AllCars = new List<Car>();
ParentParts = new List<Part>();
SubParts = new List<Part>();
}
}
Edit2:这似乎正是您需要的
session.CreateQuery(
"select parts from Car as car " +
"join car.AllParts as parts join fetch parts.SubParts where ...")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Employee>();
session.CreateQuery(
“从汽车中选择零件作为汽车”+
“将car.AllParts作为parts连接获取parts.SubParts,其中…”)
.SetResultTransformer(新DistincTrotentyResultTransformer())
.List();
您能告诉我您使用的是哪个版本的FNH和nHibernate吗?@keyr我相信我使用的是NH 3.3.0和FNH 1.3。以上这些对你不起作用吗?不,不起作用。我有两个汽车零件,每个零件有一个子零件。所以在我的AllParts系列中,我期待的全部4个部分中,我只得到了两个部分。如果你得到了全部4个部分,那么我一定是做错了什么或版本不对。@keyr请参阅我答案中的最新编辑。我希望这有助于解决你的问题。如果这不起作用,请禁用延迟加载并重试。答案为+1。我不想要一个查询,而是一张地图。我目前已经创建了一个视图,该视图实现了我想要的功能,并在地图中用作表。我目前在版本控制机制方面遇到了一些困难,我将尝试解决这些问题并发布我的答案。
public class CarMap : ClassMap<Car>
{
public CarMap()
{
Id(x => x.CarId);
Map(x => x.Name);
HasManyToMany(x => x.AllParts)
//depending on your logic, you would either set .Inverse here or in the PartMap
.Table("CarPartLink")
.ParentKeyColumn("CarId")
.ChildKeyColumn("PartId")
.Cascade.All();
}
}
public class PartMap : ClassMap<Part>
{
public PartMap()
{
Id(x => x.PartId);
Map(x => x.Name);
HasManyToMany(x => x.AllCars)
.Table("CarPartLink")
.ParentKeyColumn("PartId")
.ChildKeyColumn("CarId")
.Cascade.All();
HasManyToMany(x => x.ParentParts)
.Table("SubPartLink")
.ParentKeyColumn("Parent_PartId")
.ChildKeyColumn("Child_PartId")
.Inverse() //saving done from the child side of the relationship, right?
.Cascade.All();
HasManyToMany(x => x.SubParts)
.Table("SubPartLink")
.ParentKeyColumn("Child_PartId")
.ChildKeyColumn("Parent_PartId")
.Cascade.All();
}
}
Car Car1 = new Car();
//code to get car object
IList<Part> AllParts = new List<Part>();
GetAllParts(Car.AllParts, ref AllParts); //call a recursive method to add all the parts and subparts to the list
//do something with the list
public void GetAllParts(IList<Part> parentList, ref IList<Part> partsList)
{
foreach (Part part in parentList)
{
if (!partsList.Contains(part)) //validate if the list already contains the part to prevent replication
partsList.Add(part); //add this part to the list
if (part.SubParts.Count > 0) //if this part has subparts
GetSubParts(part.SubParts, ref partsList); //add all the subparts of this part to the list too
}
}
session.CreateQuery(
"select parts from Car as car " +
"join car.AllParts as parts join fetch parts.SubParts where ...")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Employee>();