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

FluentNhibernateはbag、マップされたプロパティがタイプの場合、多対多の関係に-mappingを使用しIListます。

マッピングには、コレクション/休止状態のパフォーマンスにいくつかのbag大きな欠点があります。現在あなたを悩ませているのは、NHは重複する要素値を許可しておらず、インデックス列がないため、主キーを定義できないことです。

簡単に言うと、NHは、bagそれらをすべて一緒に結合したときに、それらがどちらに属しているのかわかりません。

の代わりにbag、インデックス付きのバリアントaを使用します。ただし、anに同じ永続性が2回割り当てられていないsetと仮定します。InstructorCourse

ドメインクラスを修正することでクエリ結果を修正できます。これにより、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:AsSet()の効果は何ですか?

于 2012-05-06T13:56:19.873 に答える