2010-11-29 3 views
0

NHibernateを使用してクラスからデータベースを生成しようとしていますが、作成されているスキーマにクラスの列が含まれています。ほとんどの場合、これは問題ではありませんが、特に1つのクラスではこれが失敗する原因になります...注文クラス(注文はSQLで予約されたキーワードなので、おそらくキーワードではないのにそれは別の問題)だNHibernateがクラス名を持つスキーマをカラムとして生成するのはなぜですか?

次のマッピングファイル:

<?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> 

には、以下のSQLを生成

create table Orders (
    ID UNIQUEIDENTIFIER not null, 
    Version INT not null, 
    DateDeleted DATETIME null, 
    ChangeReason NVARCHAR(255) not null, 
    CompletedDate DATETIME null, 
    IsDeleted BIT null, 
    Notes NVARCHAR(255) null, 
    OrderDate DATETIME not null, 
    OrderTotal DECIMAL(19,5) null, 
    RequiredDate DATETIME null, 
    Customer UNIQUEIDENTIFIER not null, 
    Order UNIQUEIDENTIFIER null, 
    primary key (ID) 
) 

これは無効な問題の原因となっている2番目から最後の列(注文)です。私の他のすべてのクラスで起こっています - しかし、私は理由は分かりません。それについて私は何ができますか?

編集:30/11/2010 - マッピングファイルのもう一方の端:

<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> 

、それは以下を生成します。

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

どのNHのバージョンを使用していますか?あなたのhbm.xmlファイルは正常に見えます。何とか、別の列としてIDに加えて、Order列をPKとして作成しようとしているようです。 NH3を使用してこのhbm.xmlファイルを実行すると、PKとOrder列としてIDが正しく指定されます。このhbm.xmlファイルだけを別々に実行しようとしましたか? Orderクラスはどのように見えますか? (BTW - プロパティ名==列の場合は、列を指定する必要はありませんが、通常はデータ型も推測できますので、ほとんどの場合省略することができます) –

+0

NH2.1.1.GAを使用しています idだけでhbmを実行しようとしましたが、それでもOrder列を追加しようとするとエラーがスローされます。それはすべて私の他entitesも同じだ - これはOrderDetailのために生成される例えば: は バージョンINT nullでないテーブルたOrderDetails( ID UNIQUEIDENTIFIER nullではないが、作成、nullでない AdjustedPrice DECIMAL(19.5)、 LineCost DECIMAL(19 nullでない、5)nullでない、 料金DECIMAL(19.5)NOT NULL、 数量INTヌル、 [オーダー] UNIQUEIDENTIFIER nullでない、 製品UNIQUEIDENTIFIER、 OrderDetail UNIQUEIDENTIFIERヌル、 主キー(ID) ) –

+0

私はNH 3を実行しようと思ったが、まだ完全にリリースされたとは思わなかった? 私のプロパティ名の大半==列名 - hbmをより読みやすくすることができました。チップのおかげで hbmが正しいスキーマを生成すると、何が原因でファンキーなスキーマIどうやって? –

答えて

0

私は問題だと思いますキー列はOrderDetailに設定されます。列属性には、OrderDetailのOrderテーブルの外部キー列の名前が含まれている必要があります。その列にOrderDetailという名前が付けられているかどうかは疑問です。私の推測では、それはOrderIDでなければならないということです。列名の代わりにクラス名が指定された場合に発生するスキーマ生成のバグかもしれません。

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

OrderDetails.hbm.xmlファイル(前述の編集を参照)にあるように、列を「Order」に名前変更しようとしましたが、変更されませんでした。 Orders.OrderID.xxxではなくOrders.OrderDetails.xxxを参照できるようにするため、OrderDetailsに行きましたが、それはそれを行う方法ではない場合、私は変更して喜んでいます。興味深いことに、生成されたスキーマにはOrderDetailsについては言及していません。 –

+0

key列は、OrderDetails表の外部キー名を表します。バッグ名はクラス内のコレクションプロパティを表します。 Ordersのスキーマには、OrderDetailsへの参照が含まれていてはなりません。列をOrderに変更すると、生成されたスキーマは元のバージョンと同じでしたか?あなたの命名規則はこれを少し難しくしています。 –

+0

オーダーからオーダーディテールに行き、オーダーを構成するすべてのレコードを見ることができます。私はまた、OrderDetailsからOrderに行くことができるようにしたい - 注文は多くの注文詳細を持ち、注文明細は注文に属しています。これは私の第1回NHプロジェクトです。もし私が間違っていたらもっと良い方法を提案してください。 –

関連する問題