NHibernate IList в список - PullRequest
       14

NHibernate IList в список

3 голосов
/ 30 января 2009

Привет! Я пытаюсь вернуть коллекцию строительных доменов.

private long _id;
private string _buildingName;
private IList<BasicRoom> _rooms;

Я использую NHibernate и это отображение для комнат

<bag name="rooms" table="tb_rooms" lazy="false">
<key column="buildingID"/>
<one-to-many class="Room"/>
</bag>

И я так называю БД;

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>();

Проблема в том, что я не хочу, чтобы коллекция _rooms была IList, но мне нужно, чтобы она была списком. Увы, NHibernate требует, чтобы я использовал интерфейс для коллекций. Есть идеи как это сделать. Я новичок в .Net и думаю, что, возможно, отказ от NHibernate может стать выходом из положения. Мне просто нужно набрать коллекцию в виде списка, чтобы я мог двигаться дальше. Любая помощь высоко ценится.

Ответы [ 3 ]

12 голосов
/ 02 февраля 2009

Это не так, как работает NHibernate. Вы не можете сказать, каковы конкретные типы объектов вашей доменной модели. Вы только можете сказать ему, каковы основные типы и интерфейсы. Затем он решает, как эффективно реализовать типы доменов.

Например, NHibernate использует собственную внутреннюю реализацию IList<T>, которая знает, как выполнять отложенную загрузку.

Кроме того, NHibernate использует собственную внутреннюю реализацию Building из модели вашего домена. Это не обязательно тот случай, когда все Building объекты, которые вы будете использовать с NHibernate, будут иметь в качестве своего конкретного типа Building. Верно, что они будут Building с, независимо от того, является ли Building конкретным типом вашего объекта или базовым типом конкретного типа вашего объекта.

Но это , что нужно сделать , поскольку вы должны использовать интерфейсы и базовые типы вместо конкретных типов в любом случае. NHibernate помогает вам использовать все правильные подходы к программированию.

Теперь, зачем вам нужен List<Building> как таковой? Почему IList<Building> не будет достаточно?

5 голосов
/ 30 января 2009

Зачем вам нужен конкретный List объект, когда вы можете делать все, что вы хотите с IList?

Если это обязательно должен быть конкретный список, у вас есть два варианта.

Сначала просто приведите IList<Building> к List<Building>. Это будет работать, только если базовый тип равен a List<Building>, в чем я лично сомневаюсь.

Во-вторых, вызовите для него метод расширения ToList ():

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>().ToList();

Я лично рекомендую вам не делать ни того, ни другого, а использовать IList.

2 голосов
/ 02 февраля 2009

Как насчет использования конструктора List<T>, который занимает IEnumerable<T>? Тогда вы можете использовать:

Buildings = new List<Building>(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>());
...