2010-11-29 2 views
0

J'essaie de générer ma base de données à partir de classes utilisant NHibernate, mais le schéma en cours de création contient une colonne pour la classe. Pour la plupart, cela n'a pas d'importance, mais une classe en particulier provoque l'échec ... ma classe Order (parce que order est un mot-clé réservé dans SQL - oui peut-être que j'aurais dû utiliser un mot qui n'était pas un mot-clé mais c'est une autre question)Pourquoi NHibernate génère-t-il un schéma avec le nom de la classe en tant que colonne?

le fichier de mappage suivant:

<?xml version="1.0" encoding="utf-8" ?> 

<class name="Order" table="Orders"> 
    <id name="_persistenceID" column="ID" type="Guid" access="field" unsaved-value="00000000-0000-0000-0000-000000000000"> 
     <generator class="guid.comb" /> 
    </id> 
    <version name="_persistenceVersion" column="Version" access="field" type="int" unsaved-value="0" /> 

    <property name="DateDeleted" column="DateDeleted" type="DateTime" /> 
    <property name="ChangeReason" column="ChangeReason" type="String" not-null="true" /> 
    <property name="CompletedDate" column="CompletedDate" type="DateTime" /> 
    <property name="IsDeleted" column="IsDeleted" type="Boolean" /> 
    <property name="Notes" column="Notes" type="String" /> 
    <property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" /> 
    <property name="OrderTotal" column="OrderTotal" type="Decimal" /> 
    <property name="RequiredDate" column="RequiredDate" type="DateTime" /> 

    <many-to-one name="Customer" column="Customer" class="Customer" not-null="true" /> 

    <bag name="OrderDetails" table="OrderDetails" generic="true" cascade="all"> 
     <key column="OrderDetail" foreign-key="FK_OrderOrderDetails" /> 
     <one-to-many class="OrderDetail" /> 
    </bag> 

</class> 

produit l'instruction SQL suivante:

Cette dernière colonne (Order) est à l'origine de cette erreur et a mis en évidence le problème. Ça se passe dans toutes mes autres classes - mais je ne sais pas pourquoi. Que puis-je faire à ce sujet?

Edit: 30/11/2010 - L'autre extrémité du fichier de mise en correspondance:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TheWorkshop.DomainModel" namespace="TheWorkshop.DomainModel" default-access="field.camelcase-underscore" default-lazy="true"> 

<class name="OrderDetail" table="OrderDetails"> 
    <id name="_persistenceID" column="ID" type="Guid" access="field" unsaved-value="00000000-0000-0000-0000-000000000000"> 
     <generator class="guid.comb" /> 
    </id> 
    <version name="_persistenceVersion" column="Version" access="field" type="int" unsaved-value="0" /> 

    <property name="AdjustedPrice" column="AdjustedPrice" type="Decimal" not-null="true" /> 
    <property name="LineCost" column="LineCost" type="Decimal" not-null="true" /> 
    <property name="Notes" column="Notes" type="String" /> 
    <property name="Photo" column="Photo" type="String" /> 
    <property name="Price" column="Price" type="Decimal" not-null="true" /> 
    <property name="Quantity" column="Quantity" type="int" /> 

    <many-to-one name="`Order`" column="`Order`" class="Order" not-null="true" /> 
    <many-to-one name="Product" column="Product" class="Product" not-null="true" /> 

</class> 

et qui génère le texte suivant:

create table OrderDetails (
ID UNIQUEIDENTIFIER not null, 
Version INT not null, 
AdjustedPrice DECIMAL(19,5) not null, 
LineCost DECIMAL(19,5) not null, 
Notes NVARCHAR(255) null, 
Photo NVARCHAR(255) null, 
Price DECIMAL(19,5) not null, 
Quantity INT null, 
[Order] UNIQUEIDENTIFIER not null, 
Product UNIQUEIDENTIFIER not null, 
primary key (ID) 
) 
+1

Quelle version de NH utilisez-vous? Vos fichiers hbm.xml ont l'air bien. D'une certaine manière, il semble essayer de créer une colonne Order en tant que PK en plus de l'ID en tant que colonne séparée. Lorsque j'exécute ce fichier hbm.xml à l'aide de NH3, il spécifie correctement l'ID en tant que colonne PK et no Order. Avez-vous essayé d'exécuter ce fichier hbm.xml séparément? À quoi ressemble votre classe de commande. (BTW - Si le nom de la propriété == colonne, vous n'avez pas à spécifier la colonne.En outre, les types de données peuvent généralement être déduits.Vous pouvez donc les omettre dans la plupart des cas.) –

+0

J'utilise NH2.1.1.GA J'ai essayé d'exécuter le hbm avec juste l'ID et il jette toujours l'erreur, en essayant d'ajouter la colonne Ordre. Il en va de même pour tous mes autres ENTITES - par exemple ceci est généré pour OrderDetail: créer OrderDetails de table ( ID UNIQUEIDENTIFIER non nul, Version INT non null, AdjustedPrice DECIMAL (19,5) non nul, LineCost DECIMAL (19 , 5) non nulle, Prix DECIMAL (19,5) non null, null Quantité INT, [Ordre] UNIQUEIDENTIFIER non nulle, produit UNIQUEIDENTIFIER non null, null OrderDetail UNIQUEIDENTIFIER, clé primaire (ID) ) –

+0

Je ne pouvais pas essayer NH3, mais je ne pensais pas qu'il était encore disponible? La plupart de mes noms de propriété == noms de colonnes - Je pourrais rendre le hbm plus lisible, merci pour le conseil :) Si le hbm génère le schéma correct pour vous ... ce qui pourrait l'amener à générer le schéma génial I J'obtiens? –

Répondre

0

Je pense que le problème est le La colonne clé est définie sur OrderDetail. L'attribut de colonne doit contenir le nom de la colonne de clé étrangère de la table Order dans OrderDetail et je doute que vous ayez nommé cette colonne OrderDetail. Ma conjecture est que ce devrait être OrderID. Il peut s'agir d'un bogue dans la génération de schéma qui se produit lorsqu'un nom de classe est fourni à la place du nom de la colonne.

<key column="OrderDetail" foreign-key="FK_OrderOrderDetails" /> 
+0

J'ai essayé de renommer la colonne 'Order' comme dans mon fichier OrderDetails.hbm.xml (voir la modification ci-dessus), mais cela n'a pas changé les choses. Je suis allé avec OrderDetails comme je voulais pouvoir me référer à Orders.OrderDetails.xxx plutôt qu'à Orders.OrderID.xxx - mais si ce n'est pas la façon de faire les choses, je suis plus qu'heureux de changer. Fait intéressant, le schéma généré ne mentionne même pas OrderDetails. –

+0

La colonne clé représente le nom de clé étrangère dans la table OrderDetails; le nom du sac représente la propriété de collection de votre classe. Le schéma des commandes ne doit contenir aucune référence à OrderDetails. Lorsque vous avez modifié la colonne à Order, le schéma généré était identique à la version d'origine? Votre convention de nommage rend cela un peu difficile à suivre. –

+0

Je veux être en mesure d'aller de commandes à OrderDetails pour voir tous les enregistrements qui composent une commande. Je veux aussi pouvoir passer de OrderDetails à une commande - une commande peut avoir plusieurs détails de commande et un orderdetail appartient à une commande. C'est vraiment mon premier projet NH, donc si j'ai des problèmes, suggérez un meilleur moyen. –

Questions connexes