2016-05-04 4 views
0

Ich versuche, durch dieses Problem zu umgehen, wo die Unterklasse eine Reihe von Eigenschaften enthält jedoch zwei der Eigenschaften existieren nicht in der referenzierten Tabelle.NHiberate Beigetreten Subclass ungültiger Eigenschafts

Diese beiden Eigenschaften bestehen in einer Erweiterungstabelle, die FKs zurück zur Basistabelle hat. Ich bin mir nicht sicher, wie ich diesen XML-Code modifizieren kann, um die erste verbundene Unterklasse zu unterstützen und einen weiteren Join für die Extension-Tabelle hinzuzufügen.

ich eine andere Joined-Unterklasse für die Erweiterung Tabelle fügen Sie einfach versucht, aber da der Klassenname das gleiche war, war die Zuordnung ungültig.

<joined-subclass name="SESProgramAssociationAggregate.SESProgramAssociation" table="SESProgramAssociation" lazy="false"> 
    <key> 
    <column name="BeginDate" /> 
    <column name="EOId" /> 
    <column name="PEOrganizationId" /> 
    <column name="ProgramName" /> 
    <column name="ProgramTypeId" /> 
    <column name="UDI" /> 
    </key> 

    <!-- PK properties --> 
    <property name="UDI" column="UDI" type="int" not-null="true" insert="false" /> 
    <property name="ProgramTypeId" column="ProgramTypeId" type="int" not-null="true" insert="false" /> 
    <property name="PEOrganizationId" column="PEOrganizationId" type="int" not-null="true" insert="false" /> 
    <property name="BeginDate" column="BeginDate" type="date" not-null="true" insert="false" /> 
    <property name="ProgramName" column="ProgramName" type="string" length="60" not-null="true" insert="false" /> 
    <property name="EOId" column="EOId" type="int" not-null="true" insert="false" /> 

    <!-- Properties --> 
    <property name="Eligibility" column="Eligibility" type="bool" /> 
    <property name="SESDescriptorId" column="SESDescriptorId" type="int" not-null="true" /> 
    <property name="SEHoursPerWeek" column="SEHoursPerWeek" type="decimal" /> 
    <property name="HoursPerWeek" column="HoursPerWeek" type="decimal" /> 
    <property name="MultiplyD" column="MultiplyD" type="bool" /> 
    <property name="MFragile" column="MFragile" type="bool" /> 
    <property name="LastEvalDate" column="LastEvalDate" type="date" /> 
    <property name="ReviewDate" column="ReviewDate" type="date" /> 
    <property name="BeginDate" column="BeginDate" type="date" /> 
    <property name="EndDate" column="EndDate" type="date" /> 
    <property name="EventCode" column="EventCode" type="int" /> 
    <property name="WrittenConsentDate" column="WrittenConsentDate" type="date" /> 

</joined-subclass> 

Die letzte Abfrage, die erzeugt wird, schlägt fehl, da es den Eventcode und WrittenConsentDate aus der SESProgramAssociation Tabelle zu verweisen versucht, wo sie nicht existieren. Sie existieren tatsächlich in der Erweiterungstabelle.

Ich bin mir nicht sicher, wie dieses XML so geändert werden kann, dass diese Felder auf die Extension-Tabelle verweisen, sodass die generierte Abfrage sie tatsächlich aus dieser Tabelle statt aus der falschen abruft. Jede Hilfe wird sehr geschätzt, dies ist meine erste Erfahrung mit NHiberate und unnötig zu sagen, es war nicht lustig!

Nach Beratung von Frédéric, ich aktualisiert, aber habe diesen Fehler:

Eine Ausnahme vom Typ ‚NHibernate.MappingException‘ in NHibernate.dll aufgetreten, wurde aber in Benutzercode

Zusätzliche Informationen nicht behandelt: EDFI. Ods.Entities.NHibernate.Mappings.SqlServer.StudentProgramAssociationBase.hbm.xml (79,8): XML-Validierungsfehler: Das Element 'joined-subclass' im Namespace 'urn: nhibernate-mapping-2.2' hat ein ungültiges untergeordnetes Element 'join' im Namensraum 'urn: nhibernate-mapping-2.2'. Liste der möglichen Elemente erwartet: 'Eigenschaft, Viele-zu-eins, eins-zu-eins, Komponente, dynamische Komponente, Eigenschaften, beliebig, Karte, Satz, Liste, Tasche, IDBAG, Array, primitive-Array, verbundene-Unterklasse , Lader, sQL-Insert, sQL-Update, sQL-löschen, resultset, Abfrage, sQL-Abfrage‘im Namensraum 'urn: nhibernate-Mapping-2.2'.

Antwort

1

Ihre zweite Tabelle sollte nicht als weitere joined-subclass zugeordnet werden, da sie keiner Unterklasse in Ihrem Domänenmodell entspricht.

Es sollte entweder als eigenständige Extension Entität zugeordnet werden, mit der erweiterten Entität, die es als eine one-to-one verbundene Entität referenziert.

Oder Sie können das join Mapping verwenden, um eine einzelne Einheit in Ihrem Domain-Modell zu haben. Aber die join Mapping ist nicht auf subclass erlaubt, so würden Sie es auf Ihrer Basisklasse verwenden müssen, wenn Sie es, diese Eigenschaften hinzufügen können. Ihr Pastebin-Mapping in Kommentar verknüpft einstellen:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Entities.NHibernate" 
        namespace="Entities.NHibernate.SPAssociationAggregate" 
          default-access="property"> 

    <!-- Class definition --> 
    <class name="SPAssociationBase" table="SPAssociation" lazy="false"> 
    <!-- Composite primary key --> 
    <composite-id> 
     <key-property name="BeginDate" type="date" /> 
     <key-property name="OrganizationId" /> 
     <key-property name="ProgramOrganizationId" /> 
     <key-property name="ProgramName" length="60" /> 
     <key-property name="ProgramTypeId" /> 
     <key-property name="SUSI" /> 
    </composite-id> 

    <!-- Optimistic locking for aggregate root --> 
    <version name="LastModifiedDate" type="timestamp" /> 

    <!-- Transient state detection --> 
    <property name="CreateDate" type="DateTime" /> 

    <!-- Unique Guid-based identifier for aggregate root --> 
    <property name="Id" /> 

    <!-- Properties --> 
    <property name="EndDate" type="date" /> 
    <property name="ReasonExitedDescriptorId" /> 
    <property name="ServedOutsideOfRegularSession" /> 

    <!-- Collections --> 
    <bag name="SPAssociationServices" cascade="all-delete-orphan" inverse="true" lazy="false"> 
     <key> 
     <column name="BeginDate" /> 
     <column name="OrganizationId" /> 
     <column name="ProgramOrganizationId" /> 
     <column name="ProgramName" /> 
     <column name="ProgramTypeId" /> 
     <column name="SUSI" /> 
     </key> 
     <one-to-many class="SPAssociationServiceForBase" /> 
    </bag> 

    <!-- Extended properties --> 
    <join table="SSEPAssociationExtension" optional="true"> 
     <key> 
     <column name="BeginDate" /> 
     <column name="OrganizationId" /> 
     <column name="ProgramOrganizationId" /> 
     <column name="ProgramName" /> 
     <column name="ProgramTypeId" /> 
     <column name="SUSI" /> 
     </key> 
     <property name="EventCode" /> 
     <property name="WrittenConsentDate" /> 
    </join> 

    <!-- Derived classes --> 
    <joined-subclass name="SESProgramAssociationAggregate.SESProgramAssociation" table="SESProgramAssociation" lazy="false"> 
     <key> 
     <column name="BeginDate" /> 
     <column name="OrganizationId" /> 
     <column name="ProgramOrganizationId" /> 
     <column name="ProgramName" /> 
     <column name="ProgramTypeId" /> 
     <column name="SUSI" /> 
     </key> 

     <!-- Properties --> 
     <property name="IdeaEligibility" /> 
     <property name="DescriptorId" /> 
     <property name="HoursPerWeek" /> 
     <property name="SHoursPerWeek" /> 
     <property name="MultiplyD" /> 
     <property name="MFragile" /> 
     <property name="LastEvaluationDate" type="date" /> 
     <property name="ReviewDate" type="date" /> 
     <property name="BeginDate" type="date" /> 
     <property name="EndDate" type="date" /> 
     <property name="EventCode" /> 
     <property name="WrittenConsentDate" type="date" /> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

Side Hinweise:

  • besser zusammengesetzte Schlüssel, wenn möglich vermeiden. Oder ordnen Sie sie als component, überschreiben GetHashCode und Equals für sie, ...
  • Es gibt keine Notwendigkeit, Eigenschaftennamen als Spaltennamen zu duplizieren, wenn sie gleich sind. Die meisten Eigenschaftstypen können von NHibernate aus der zugrunde liegenden Klasse abgeleitet werden. Wenn sie übereinstimmen, sollten Sie Ihr Mapping nicht aufheben, indem Sie ihren Typ im Mapping angeben. (Daher habe ich in meinem obigen Beispiel nur die Länge der Strings und den Typ des Datums angegeben, da es keine genaue Übereinstimmung zwischen .Net-Daten & Zeittypen und SQL-Einträgen gibt.)
  • Es ist seltsam, Ihren Primärschlüssel als Eigenschaften in der Unterklasse neu zu "zuordnen". Sie sollten diese Eigenschaften von der Basisklasse <id> erben, sodass Sie sie in der verbundenen Unterklasse nicht erneut zuordnen müssen.
  • Deaktivieren lazy Laden ist keine übliche Praxis mit NHibernate. Lazy Loading mit NHibernate kann von Batchladungen profitieren, die es ziemlich effizient machen. Siehe meine Antwort here für weitere Details.
    Obwohl mit zusammengesetzten Schlüsseln sollten Sie sie als Komponenten für die Bereitstellung von Lazy Loads zuordnen. (Andernfalls wird beim Laden auf eine der Schlüsseleigenschaften eines entladenen Proxys dieser geladen.)
+0

Vielen Dank für die Eingabe. Das Schlimme hier ist, dass ich glaube, ich habe vergessen zu erwähnen, dass diese beiden Felder in der Klasse existieren, die in der Joined-Klasse - SESProgramAssociation - benannt ist. Das Problem liegt an verschiedenen Standards für die Implementierung. Ich kann die SESProgramAssociation-Klasse nicht ändern, um beispielsweise diese Felder zu entfernen und eine eigenständige Klasse für diese Entität zu generieren. Ich muss irgendwie die SESProgramAssociation wiederverwenden, aber nur diese beiden Felder und beziehen sich auf die Erweiterungstabelle .... hoffentlich macht das Sinn. –

+0

Dann meinen dritten Satz ist der Weg für Sie gehen, verwenden Sie die '' Mapping in '' für die Zuordnung Sie zwei andere Eigenschaften. –

+0

Gab das einen Versuch aber Fehler, aktualisiert das OP. Link zur vollständigen Mapping-Datei, die beim Debuggen helfen kann: http://pastebin.com/ybSKHDsG –

Verwandte Themen