NHibernate IList à la Liste
Salut, je suis en train d'essayer de renvoyer une collection de bâtiment de domaine.
private long _id;
private string _buildingName;
private IList<BasicRoom> _rooms;
Je suis à l'aide de NHibernate et cette cartographie pour les chambres
<bag name="rooms" table="tb_rooms" lazy="false">
<key column="buildingID"/>
<one-to-many class="Room"/>
</bag>
Et je suis l'appel de la db comme cela;
Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>();
Le problème est que je ne veux pas le _rooms de la collection IList mais j'en ai besoin pour avoir une Liste. Hélas, NHibernate, je dois utiliser une Interface pour les collections.
Une idée de comment faire cela. Je suis nouvelle dans .Net et de penser que peut-être tomber NHibernate pourrait être la voie à suivre. J'ai juste besoin d'obtenir la collection de taper comme une Liste pour que je puisse aller sur.
Toute aide appréciée.
OriginalL'auteur user17510 | 2009-01-30
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas la façon dont NHibernate œuvres. Vous n'obtenez pas de dire ce que les types de béton de votre nom de domaine objets du modèle sont. Vous obtenez seulement de dire ce que les types de base et les interfaces sont. Elle obtient ensuite de choisir la façon de mettre en œuvre les types de domaine de manière efficace.
Par exemple, NHibernate utilise ses propres internes de mise en œuvre de
IList<T>
qui sait comment faire le chargement paresseux.En outre, NHibernate utilise ses propres internes de mise en œuvre de
Building
à partir de votre modèle de domaine. Il n'est pas nécessairement le cas de tous lesBuilding
objets que vous utiliserez avec NHibernate auront, comme leur type de béton,Building
. Il est vrai qu'ils serontBuilding
s, siBuilding
est le type concret de votre objet, ou si elle est le type de base du béton type de votre objet.Mais c'est la bonne chose à faire, puisque vous êtes censé à l'aide d'interfaces et types de base au lieu des types de béton, de toute façon. NHibernate vous permet d'utiliser toutes les bonnes approches de la programmation.
Maintenant, pourquoi avez-vous besoin d'une
List<Building>
en soi? PourquoiIList<Building>
suffit pas?Il y a de bonnes raisons d'utiliser la Liste plus d'IList. Liste contient beaucoup plus de fonctionnalités pour la construction d'utile prédicats comme un exemple. Disposer d'un outil vous forcer à utiliser des interfaces n'est pas "la bonne chose à faire" à mon avis. il serait mieux si le POCOs ont été laissés de côté et de ne pas flottaient par la queue de votre fournisseur de données. Personnellement, je ne l'aime si liste et sac de mappages avait un meilleur support pour les objets de la Liste.
OriginalL'auteur yfeldblum
Pourquoi avez-vous besoin d'un béton
List
objet, quand vous pouvez faire tout ce que vous voulez avec unIList
?Si elle doit absolument être une liste concrète, vous avez deux options.
D'abord, il suffit de lancer le
IList<Building>
àList<Building>
. Cela ne fonctionnera que si le type sous-jacent est unList<Building>
, dont je doute personnellement.Seconde, appelez le ToList() la méthode d'extension:
Personnellement, je recommande que vous n'avez ni et utiliser le IList à la place.
Merci pour l'aide. La raison en est que lorsque j'envoie l'objet de retour (à partir de l'interface utilisateur (flex)) après une mise à jour, etc), la passerelle de la carte de l'objet en arrière, et refuse des chambres de IList. La passerelle est en me forçant à utiliser la Liste.
Juste pour obtenir les données de flex et de retour dans la db via NHibernate est assez délicat.
Eh bien, si vous devez vous devez. Probablement utiliser ToList() plutôt que de la fonte, juste au cas où le type sous-jacent n'est pas la Liste.
La meilleure solution serait de changer la passerelle pour prendre un IList (ou mieux ICollection ou IEnumerable) au lieu de type de béton. Maintenir l'utilisation de types de béton à l'étendue la plus étroite possible.
OriginalL'auteur Randolpho
Comment sur l'utilisation du constructeur de
List<T>
qui prend unIEnumerable<T>
? Ensuite, vous pouvez utiliser:OriginalL'auteur Sean Carpenter