ArgumentOutOfRangeException : Index était hors de gamme
Je reçois ce bizarre ArgumentOutOfRangeException chaque fois que j'utilise le
PersitenceSpecification classe pour la vérification d'une entité qui a une
référence à un objet de valeur.
public class CatalogItem : DomainEntity
{
internal virtual Manufacturer Manufacturer { get; private
set; }
internal virtual String Name { get; private set; }
protected CatalogItem()
{}
public CatalogItem(String name, String manufacturer)
{
Name = name;
Manufacturer = new Manufacturer(manufacturer);
}
}
public class CatalogItemMapping : ClassMap<CatalogItem>
{
public CatalogItemMapping()
{
Id(catalogItem => catalogItem.Id);
Component<Manufacturer>(category => category.Manufacturer,
m => m.Map(manufacturer =>
manufacturer.Name));
Map(catalogItem => catalogItem.Name);
Map(Reveal.Property<CatalogItem>("Price"));
}
}
[TestFixture]
public class When_verifying_the_class_mapping_of_a_catalog_item
: NHibernateSpecification
{
[Test]
public void Then_a_catalog_object_should_be_persistable()
{
new PersistenceSpecification<CatalogItem>(Session)
.VerifyTheMappings();
}
}
[TestFixture]
public class NHibernateSpecification
: Specification
{
protected ISession Session { get; private set; }
protected override void Establish_context()
{
var configuration = new SQLiteConfiguration()
.InMemory()
.ShowSql()
.ToProperties();
var sessionSource = new SessionSource(configuration, new
RetailerPersistenceModel());
Session = sessionSource.CreateSession();
sessionSource.BuildSchema(Session);
ProvideInitialData(Session);
Session.Flush();
Session.Clear();
}
protected override void Dispose_context()
{
Session.Dispose();
Session = null;
}
protected virtual void ProvideInitialData(ISession session)
{}
}
Voici l'erreur que je reçois:
Cas de test
'Then_a_catalog_object_should_be_persistable' n'est pas exécuté:
Système.ArgumentOutOfRangeException :
Index était hors de portée. Doit être
non-négative et inférieure à la taille de
la collecte. Nom du paramètre: index
au Système.ThrowHelper.ThrowArgumentOutOfRangeException
(ExceptionArgument argument,
ExceptionResource de ressources)
au Système.ThrowHelper.ThrowArgumentOutOfRangeException()
au Système.Les Collections.Génériques.Liste1.get_Item(Int32
1.TransactionalSave
index)
at System.Data.SQLite.SQLiteParameterCollection.GetParameter(Int32
index)
at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item
(Int32 index)
at NHibernate.Type.GuidType.Set(IDbCommand
cmd, Object value, Int32 index)
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand
cmd, Object value, Int32 index)
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand
st, Object value, Int32 index,
ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate
(Object id, Object[] fields, Object
rowId, Boolean[] includeProperty,
Boolean[][] includeColumns, Int32
table, IDbCommand statement,
ISessionImplementor session, Int32
index)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object
id, Object[] fields, Boolean[]
notNull, Int32 j, SqlCommandInfo sql,
Object obj, ISessionImplementor
session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object
id, Object[] fields, Object obj,
ISessionImplementor session)
at NHibernate.Action.EntityInsertAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable
executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList
list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions
(IEventSource session)
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush
(FlushEvent event)
at NHibernate.Impl.SessionImpl.Flush()
at NHibernate.Transaction.AdoTransaction.Commit()
d:\Builds\FluentNH\src\FluentNHibernate\Testing
\PersistenceSpecification.cs(127,0):
at
FluentNHibernate.Testing.PersistenceSpecification
(Objet propertyValue)
d:\Builds\FluentNH\src\FluentNHibernate\Test
\PersistenceSpecification.cs(105,0):
au
FluentNHibernate.Les tests.PersistenceSpecification`1.VerifyTheMappings
()
C:\Source\SupplyChain\Tests\Détaillant.IntegrationTests\Mappages
\CatalogItemMappingSpecifications.cs(14,0):
au
SupplyChain.Le détaillant.IntegrationTests.Les mappages.When_verifying_the_class_mapping_of_a_catalog_item.Then_a_catalog_object_should_be_persistable
()
Désolé pour le long post, mais celui-ci m'a occupé pendant un couple de
heures maintenant. Cela pourrait ne pas être causée par la FNH que j'ai trouvé ce ticket JIRA
de NH lui-même qui parle de quelque chose de similaire:
http://forum.hibernate.org/viewtopic.php?p=2395409
J'espère toujours que je suis en train de faire quelque chose qui cloche dans mon code :-). Tout
la pensée?
Merci d'avance
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la solution à ce problème qui résulte de mon propre
la stupidité dans la première place. Tout est devenu clair pour moi dès que je
généré le hbm fichiers à partir de la fluidité de la NH cartographie.
Avis que la colonne pour le Nom de la propriété et de la colonne de la
Fabricant de composants sont à la fois mappé à la même colonne. C'est pourquoi
cela se traduit par une ArgumentOutOfRangeException, parce qu'il y avait
plus d'arguments qu'il y avait des noms de colonne. J'ai résolu ce problème par
explicitement spécifier un nom de colonne pour le composant de mapping:
Composant(catalogItem => catalogItem.Fabricant,
m => m.Carte(fabricant => fabricant.Nom,
"Fabricant"));
Autre leçon.
Dans mon cas, j'ai été mappage de deux propriétés à la même colonne avec
Fluent NHibernate
.Votre
CatalogItem
ne semble pas avoir unPrice
de la propriété, ce qui me semble bizarre quand vous êtes à l'aide de laReveal
helper.Oui, je l'ai enlevé pour réduire le bruit. Je suppose que j'ai oublié de l'enlever de la cartographie ainsi. Après une enquête, j'ai remarqué qu'il a quelque chose à voir avec le Fabricant mappé en tant que composant. Lorsque je l'ai utilisé un bon vieil chaîne au lieu d'une catégorie distincte, tout fonctionne bien.
Dans mon cas particulier, j'ai été l'ajout de la propriété ainsi qu'une pièce d'identité (à l'aide d'attributs) au cours de la même .NETS de la propriété. Cela a abouti à la même erreur.
Vieille question, mais si quelqu'un s'exécute dans le même problème que j'ai fait, il peut être utile de savoir que cette Nhibernate Fluent question (ColumnPrefix applique uniquement à la première Composante de la cartographie à l'intérieur d'un ComponentMap) peut donner la même exception, depuis les colonnes de préfixes ne sont pas toujours appliquées.