Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Fluent NHibernate中映射不相关(无直接关系)的表_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

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