FluentNhibernate加载多对多子对象

FluentNhibernate加载多对多子对象,nhibernate,fluent-nhibernate,many-to-many,eager-loading,Nhibernate,Fluent Nhibernate,Many To Many,Eager Loading,我尝试使用FluentNhibernate查询数据,结果发现错误:序列包含多个匹配元素 以下是我的类和映射: public class Course { public virtual int Id { get; private set; } public virtual string Name { get; set; } public virtual IList<Instructor> Instructors { get; set; } } public c

我尝试使用FluentNhibernate查询数据,结果发现错误:序列包含多个匹配元素

以下是我的类和映射:

public class Course
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual IList<Instructor> Instructors { get; set; }
}

public class Instructor
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual ImageData Portrait { get; set; }
    public virtual ImageData PortraitThumb { get; set; }
    public virtual IList<Course> TeachingCourses { get; private set; }
}

public class ImageData : Entity
{
    public virtual int Id { get; private set; }
    public virtual byte[] Data { get; set; }
}

public class CourseMap : ClassMap<Course>
{
    public CourseMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasManyToMany(x => x.Instructors)
            .Cascade.All()
            .Table("CourseInstructor");
    }
}

public class InstructorMap : ClassMap<Instructor>
{
    public InstructorMap()
    {
        Id(x => x.Id);
        Map(x=> x.Name);
        References(x => x.Portrait)
            .Nullable()
            .Cascade.All();
        References(x => x.PortraitThumb)
            .Nullable()
            .Cascade.All();
        HasManyToMany(x => x.TeachingCourses)
            .Cascade.All()
            .Inverse()
            .Table("CourseInstructor");
    }
}

public class ImageDataMap : ClassMap<ImageData>
{
    public ImageDataMap()
    {
        Id(x => x.Id);
        Map(x => x.Data);
    }
}
然后,我尝试使用以下代码获取数据:

var course = session.CreateCriteria(typeof(Course))
               .SetFetchMode("Instructors", FetchMode.Eager)
               .SetFetchMode("Instructors.Portrait", FetchMode.Eager)
               .SetFetchMode("Instructors.PortraitThumb", FetchMode.Eager)
               .List<Course>();
但我得到以下错误:序列包含多个匹配元素 还有,当我尝试这个的时候

var course = session.CreateCriteria(typeof(Course))
               .SetFetchMode("Instructors", FetchMode.Eager)
               .SetFetchMode("Instructors.Portrait", FetchMode.Eager)
               .SetFetchMode("Instructors.PortraitThumb", FetchMode.Eager)                   
               .SetResultTransformer(new DistinctRootEntityResultTransformer())
               .List<Course>();
没有发生错误,但我得到了重复的讲师对象

我确实尝试了下面的帖子和其他一些帖子。但这没用

如果映射属性的类型为IList,则FluentNhibernate会对多对多关系使用包映射

包映射有几个主要缺点。目前困扰您的问题是NH不允许重复的元素值,因为它们没有索引列,所以无法定义主键

简单地说,NH不知道当你把它们都放在一起时它们属于哪个袋子

假设一个讲师没有两次分配相同的持续课程,我会使用一个索引变量来代替bag

您可以通过修改域类来修复查询结果,这会告诉FluentNhibernate使用集合而不是按约定使用包:

public class Course
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual Iesi.Collections.Generic.ISet<Instructor> Instructors { get; set; }
}

public class Instructor
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual ImageData Portrait { get; set; }
    public virtual ImageData PortraitThumb { get; set; }
    public virtual Iesi.Collections.Generic.ISet<Course> TeachingCourses { get; private set; }
}

此外,您还可以使用.AsSet修改映射

你能发布你期望检索的内容和你实际检索的内容吗?我想这个问题是由于使用了IList而不是ISet造成的。非常感谢。现在是工作。但是当我使用Iesi.Collections.ISet时,我得到了一个错误=>非泛型类型“Iesi.Collections.ISet”不能与类型参数一起使用,然后我使用ICollection来代替它。@Siripongz:我没有测试代码,用谷歌搜索错误的命名空间Iesi.Collections.ISet而不是Iesi.Collections.generic.ISet。我更新了答案。感谢您发现错误。