FluentNhibernate Eager加载多对多子对象

时间:2012-05-06 06:15:11

标签: 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 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>();

但是我收到以下错误:“Sequence包含多个匹配元素” 此外,当我尝试这个

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

没有发生错误但我得到了重复的Instructor个对象。

我确实尝试过以下帖子和其他一些帖子。但它没有帮助。

1 个答案:

答案 0 :(得分:0)

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

bag映射有一些主要缺点Performance of Collections / hibernate。当前咬你的是NH不允许重复的元素值,因为它们没有索引列,所以不能定义主键。

简单地说,当你们加入他们时,NH不知道他们属于哪个bag

而不是bag我会使用索引变体set,假设Instructor没有分配两次相同的持久性Course

您可以通过修改域类来修复查询结果,这会告诉FluentNhibernate按惯例使用set而不是bag

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()修改映射。 FluentNHibernate: What is the effect of AsSet()?