我尝试使用 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
个对象。
我确实尝试过以下帖子和其他一些帖子。但它没有帮助。
答案 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()?