Fluent NHibernate: более одной строки с заданным идентификатором для класса

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

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

TItemListUserPerm

  • Идентификатор пользователя (ПК, ФК)
  • TItemListID (ПК, ФК)
  • TItemListPermID (ПК, ФК)

После мучений с тем, как сопоставить это, я пришел к выводу, что проще всего будет удалить составной первичный ключ, добавить уникальный первичный ключ идентичности и превратить 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?


person DerHaifisch    schedule 27.02.2011    source источник
comment
Что такое IdOfUser и ClassNameOfObject?   -  person Stefan Steinegger    schedule 28.02.2011
comment
Кстати: пожалуйста, старайтесь спрашивать как можно короче и конкретнее. Поработайте над своей проблемой, чтобы найти реальный источник проблемы, и спросите об этом. Люди обычно не хотят тратить часы.   -  person Stefan Steinegger    schedule 28.02.2011
comment
Спасибо за ваш совет, и я приму его во внимание для будущих вопросов. К сожалению, я понятия не имел, каков был настоящий источник проблемы, и я когда-либо задавал вопросы только тогда, когда не мог найти его сам (например, исследуя блоги, группы новостей и т. д.). Я смог найти источник проблемы и, в конце концов, нашел решение.   -  person DerHaifisch    schedule 01.03.2011


Ответы (1)


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

person DerHaifisch    schedule 01.03.2011