1

我有两节课。这两个类具有相似的结构,因为它们都具有多对多关系。但奇怪的是,第二节课引起了LazyInitializationException. 我不知道为什么?两者都从中间表中获取数据,但为什么第二类只产生错误?

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 回答