2009-12-21 7 views
0

J'ai une classe StoreHours qui a une clé composite et qui fonctionne parfaitement. Une nouvelle demande est venue pour un autre type d'heures à retourner. Je pensais "simple, je vais faire abstraction de la classe de base, avoir deux implémentations concrètes et changer mes références dans l'application à l'une des nouvelles classes". Cependant, sur le faire, mes tests unitaires a échoué avecSous-classes NHibernate et touches composées

X.Test.StoreTest.HoursTest: NHibernate.InstantiationException: instanciation classe abstraite ou de l'interface: X.Model.StoreHours

Mon fichier de mappage ressemble

<class name="StoreHours" table="StoreHour" abstract="true" discriminator-value="0" > 
    <composite-id> 
     <key-many-to-one name="Store" 
      class="Store" 
      column="StoreUid"/> 
     <key-property name="DayOfWeek" 
      column="DayOfWeekId" 
      type="System.DayOfWeek" /> 
    </composite-id> 
    <discriminator column="StoreHourType" type="Byte" /> 
    <property name="OpenMinutes" column="OpenTime" /> 
    <property name="CloseMinutes" column="CloseTime" /> 
    <subclass name="OfficeHours" discriminator-value="1" /> 
    <subclass name="AccessHours" discriminator-value="2" /> 
</class> 

J'ai trouvé quelqu'un avec des problèmes semblables here et a commencé à descendre leur chemin de solution mais en fait fini avec encore plus de problèmes que j'ai commencé.

Je peux persister parfaitement les dossiers à la base de données, mais onload, NHibernate essaie d'instancier l'abstrait « storehours », même si je n'ai que typer partis « » OfficeHours

Cela semble vraiment exigence banale donc je suppose que je dois faire quelque chose de mal. Tous les conseils appréciés.

Répondre

1

The problem is in the way you are using the composite-id

table par classe travaille avec l'ID Composite, mais seulement si le composite est mis en œuvre en tant que classe

donc vous devez créer une classe comme

Dans votre objet StoreHours, créez une propriété qui utilise la classe ci-dessus (dans mon exemple, je l'ai appelée "StoreHoursCompositeId")

Votre carte devient:

<class name="StoreHours" table="StoreHour" abstract="true" discriminator-value="0" > 
    <composite-id name="StoreHoursCompositeId" class="StoreHoursCompositeId"> 
     <key-many-to-one name="Store" class="Store" 
      column="StoreUid"/> 
     <key-property name="DayOfWeek" 
      column="DayOfWeekId" 
      type="System.DayOfWeek" /> 
    </composite-id> 
    <discriminator column="StoreHourType" type="Byte" /> 
    <property name="OpenMinutes" column="OpenTime" /> 
    <property name="CloseMinutes" column="CloseTime" /> 
    <subclass name="OfficeHours" discriminator-value="1" /> 
    <subclass name="AccessHours" discriminator-value="2" /> 
</class> 

J'ai eu le problème même et ce qu'il fixe pour moi.

+1

Fascinant. Espérons que cela aidera quelqu'un. Malheureusement c'est environ 4,5 ans trop tard pour moi :) Ont marqué cela comme la bonne réponse sans essayer. Ma réponse est totalement fausse en ce qui me concerne. – toxaq

+0

haha ​​ouais, j'ai répondu pour les futurs lecteurs :-) –