FluentNhibernate加载多对多子对象
我尝试使用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
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。我更新了答案。感谢您发现错误。