1

我尝试使用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>();

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

我确实尝试过下面的帖子和其他一些帖子。但这无济于事。

4

1 回答 1

0

FluentNhibernatebag对多对多关系使用 -mapping,如果映射的属性是 type IList

映射bag有一些主要缺点Collections/hibernate 的性能。当前困扰您的是 NH 不允许重复的元素值,并且由于它们没有索引列,因此无法定义主键。

简单地说,当您将它们全部加入时,NH 不知道bag它们属于哪个。

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

您可以通过修改域类来修复查询结果,这会告诉 FluentNhibernate 按照惯例使用 aset而不是 a 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:AsSet() 的作用是什么?

于 2012-05-06T13:56:19.873 回答