Свободный NHibernate: более одной строки с данным идентификатором для класса - PullRequest
0 голосов
/ 27 февраля 2011

Этот вопрос на самом деле связан с предыдущим вопросом, который у меня был.

У меня была таблица базы данных TItemListUserPerm с составным первичным ключом, состоящим из трех полей.

TItemListUserPerm

  • UserId (PK, FK)
  • TItemListID (PK, FK)
  • TItemListPermID (PK, FK)

После попыток сопоставить это, я пришел к выводу, что проще всего будет удалить составной первичный ключ, добавить уникальный первичный ключ идентификации и превратить TItemListUserPerm в сущность, которую я затем смогу сопоставить.

Результат был:

public class TaskItemListUserPermission {
   public int Id { get; set; }
   public User User { get; set; }
   public TaskItemList TaskItemList { get; set; }
   public TaskItemListPermission Permissions{ get; set; }
}

Карта была:

public class TaskItemListUserPermissionMap : ClassMap<TaskItemListUserPermission> {
  public TaskItemListUserPermissionMap() {
    Table("TtemListUserPerm");
    Id(x => x.Id, "TaskItemListUserPermId");
    References(x  => x.User, "UserId");
    References(x => x.Permissions, "TItemListPermID");
    References(x => x.TaskItemList, "TItemListID");
  }
}

public class TaskItemListMap : ClassMap<TaskItemList> {
  Table("TItemList");
  Id(x => x.Id, "TItemListID");
  ....
  HasMany<TaskItemListUserPermission>(x => x.UserPermssions)
   .Table("TItemListUserPerm")
   .KeyColumn("TItemListId")
   .AsBag();
}

Все отлично работает. Я получаю результаты; не совсем то, что я хочу, но я думаю, что могу работать до тех пор, пока не напишу запросы Linq, например:

List<TaskItemList> taskItemLists = taskItemListRepository.GetAll() as List<TaskItemList>;
     List<TaskItemListUserPermission> permissions = taskItemLists.First().TaskItemListUserPermission.ToList();

     var myName= permissions.Where<TaskItemListUserPermission>(x => x.User.FirstName == "FirstNameOfUser" && x.User.LastName == "LastNameOfUser");

Когда я выполняю код, я получаю сообщение об ошибке: найдено более одной строки данного идентификатора: IdOfUser для ClassNameOfObject.

Я знаю, что получаю группу пользователей с одинаковым идентификатором. Они являются частью объекта, который находится в перечисляемом списке. Может кто-нибудь пролить свет на то, почему я получаю ошибку и как ее исправить или обойти? Нужно ли использовать Linq-To-NHibernate?

1 Ответ

0 голосов
/ 01 марта 2011

В конечном итоге проблема заключалась в несовпадении классов, в частности класса User. Я сузил источник, комментируя Ссылки в карте классов, пока не было получено ни одной ошибки. Как только я это сделал, я смог вывести проблему. Я ценю всех, кто смотрел на этот вопрос и пытался на него ответить.

...