J'ai une classe appelée ReportRequest comme:
public class ReportRequest
{
Int32 templateId;
List<Int32> entityIds;
public virtual Int32? Id
{
get;
set;
}
public virtual Int32 TemplateId
{
get { return templateId; }
set { templateId = value; }
}
public virtual List<Int32> EntityIds
{
get { return entityIds; }
set { entityIds = value; }
}
public ReportRequest(int templateId, List<Int32> entityIds)
{
this.TemplateId = templateId;
this.EntityIds = entityIds;
}
}
Il est mappé en utilisant Fluent Hibernate comme:
public class ReportRequestMap : ClassMap<ReportRequest>
{
public ReportRequestMap()
{
Id(x => x.Id).UnsavedValue(null).GeneratedBy.Native();
Map(x => x.TemplateId).Not.Nullable();
HasMany(x => x.EntityIds).Table("ReportEntities").KeyColumn("ReportRequestId").Element("EntityId").AsBag().Cascade.AllDeleteOrphan();
}
}
Maintenant, je crée un objet de cette classe comme
ReportRequest objReportRequest = new ReportRequest(2, new List<int>() { 11, 12, 15 });
et essayez d'enregistrer l'objet dans la base de données en utilisant
session.Save(objReportRequest);
J'obtiens l'erreur suivante:
"Impossible de lancer un objet de type 'NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List
1 [System.Int32]'. "
Je ne suis pas sûr d'avoir mappé correctement la propriété EntityIds. Veuillez guider.
Merci!
Réponses:
Utilisez des interfaces de collection au lieu de collections concrètes, afin que NHibernate puisse l'injecter avec sa propre implémentation de collection.
Dans ce cas, utilisez à la
IList<int>
place deList<int>
la source
J'ai trouvé que l'utilisation
ICollection<T>
fonctionnait là où celaIList<T>
ne fonctionnait pas.Je ne suis pas un sorcier NHibernate, mais je voulais jeter un os à quelqu'un d'autre qui pourrait atterrir sur ce problème.
la source
bag
vous pouvez utiliserIList<T>
et pour ensemble -ISet<T>