1

私は2つのクラスを持っています。どちらのクラスも、多対多の関係を持つという点で類似した構造を持っています。しかし、奇妙なことに、2 番目のクラスがLazyInitializationException. 理由がわからない?どちらも中間テーブルからデータを取得していますが、なぜ 2 番目のクラスだけがエラーを生成しているのでしょうか?

public class TaskMap : VersionedClassMap<Task>
{
    public TaskMap()
    {
        Id(x => x.TaskId);
        Map(x => x.Subject).Not.Nullable();
        Map(x => x.StartDate).Nullable();
        Map(x => x.DueDate).Nullable();
        Map(x => x.DateCompleted).Nullable();

        References(x => x.Status, "StatusId");
        References(x => x.Priority, "PriorityId");
        References(x => x.CreatedBy, "CreatedUserId");

        HasManyToMany(x => x.Users)
            .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
            .Table("TaskUser")
            .ParentKeyColumn("TaskId")
            .ChildKeyColumn("UserId");

        HasManyToMany(x => x.Categories)
            .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
            .Table("TaskCategory")
            .ParentKeyColumn("TaskId")
            .ChildKeyColumn("CategoryId");
    }
}

public class LocationMap: VersionedClassMap<Location>
{
    public LocationMap()
    {
        Id(x => x.LocationId);
        Map(x => x.Name).Not.Nullable();
        Map(x => x.Address).Nullable();
        Map(x => x.City).Nullable();
        Map(x => x.State).Nullable();
        Map(x => x.Country).Nullable();
        Map(x => x.Pincode).Nullable();

        HasManyToMany(x => x.Departments)
            .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
            .Table("LocationDepartment")
            .ParentKeyColumn("LocationId")
            .ChildKeyColumn("DepartmentId"); //.Fetch.Join(); Adding this removes the error
    }
}

編集:

プロジェクトのリンクはこちらです。

4

1 に答える 1

2

ISession でどのように使用するかコードを指定しませんでしたが、閉じたセッションに関連付けられたエンティティで初期化されていない遅延プロパティ/コレクションを読み込もうとすると、このような例外が発生します。エンティティを操作するまでセッションを維持します。 更新
セッションがいつどこで閉じられるのか、合理的な時間内に把握できません。最善の方法は、クエリで熱心な読み込みを使用することです。以下は LocationController の例です。

public IEnumerable<Location> Get()
{
    return _session
            .QueryOver<Data.Model.Location>()
            .Fetch(x => x.Departments).Eager
            .List()
            .Select(_locationMapper.CreateLocation);
}
于 2013-08-23T14:23:14.277 に答える