2013-08-23 3 views
0

У меня есть два класса. Оба класса имеют схожую структуру, поскольку оба они имеют отношение «многие ко многим». Но, как ни странно, второй класс вызывает LazyInitializationException. Я не знаю, почему? Оба извлекают данные из промежуточной таблицы, но почему второй класс производит ошибку?NHibernate 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 
    } 
} 

EDIT:

Вот link для проекта.

ответ

2

Вы не указали какой-либо код, как вы используете его с ISession, но такое исключение возникает, когда вы пытаетесь прочитать неинициализированное ленивое свойство/коллекцию для объекта, связанного с закрытым сеансом. Сохраняйте сеанс до тех пор, пока не будете работать с объектами. ОБНОВЛЕНИЕ
Я не могу понять в разумные сроки, когда и когда сессия закрыта. Лучшее, что вы можете сделать, это использовать загрузку в ваших запросах. Вот пример для LocationController:

public IEnumerable<Location> Get() 
{ 
    return _session 
      .QueryOver<Data.Model.Location>() 
      .Fetch(x => x.Departments).Eager 
      .List() 
      .Select(_locationMapper.CreateLocation); 
} 
+0

Поделитесь всем своим решением, как только я доберусь до офиса в понедельник. Пожалуйста, помогите мне решить эту проблему. –

+0

Я добавил исходный код. Не могли бы вы рассказать мне, что происходит. –

+0

Существует много кода. Куда это исключение? Как воспроизвести проблему? –

Смежные вопросы