为什么NHibernate以类名作为列生成模式?

为什么NHibernate以类名作为列生成模式?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我试图使用NHibernate从类生成数据库,但是正在创建的模式包含该类的一列。在大多数情况下,这并不重要,但有一个类特别导致此失败。。。我的Order类(因为Order在SQL中是一个保留关键字-是的,也许我应该使用一个不是关键字的单词,但这是另一个问题) 以下映射文件: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly

我试图使用NHibernate从类生成数据库,但是正在创建的模式包含该类的一列。在大多数情况下,这并不重要,但有一个类特别导致此失败。。。我的Order类(因为Order在SQL中是一个保留关键字-是的,也许我应该使用一个不是关键字的单词,但这是另一个问题)

以下映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<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>
正是第二列到最后一列(顺序)导致该列无效并突出显示了问题。这在我所有的其他课程中都有发生,但我不知道为什么。我能怎么办

编辑:30/11/2010-映射文件的另一端:

<?xml version="1.0" encoding="utf-8" ?>
<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>

我认为问题在于键列设置为OrderDetail。column属性应该包含OrderDetail中Order表中外键列的名称,我怀疑您是否已将该列命名为OrderDetail。我猜应该是OrderID。当提供类名而不是列名时,可能是架构生成中的错误

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


您使用的是哪个版本的NH?您的hbm.xml文件看起来不错。不知何故,它似乎试图创建一个Order列作为PK,而不是ID列作为单独的列。当我使用NH3运行这个hbm.xml文件时,它正确地将ID指定为PK和no Order列。您是否尝试过单独运行这个hbm.xml文件?你的订单类是什么样子的。(顺便说一句,如果property name==column,则不必指定column。通常也可以推断数据类型。因此,在大多数情况下可以忽略它们。)我使用的是NH2.1.1.GA。我尝试仅使用id运行hbm,但它仍然抛出错误,试图添加Order列。这与我的所有其他实体相同-例如,这是为OrderDetail生成的:创建表OrderDetails(ID UNIQUEIDENTIFIER不为null,Version INT不为null,AdjustedPrice DECIMAL(19,5)不为null,LineCost DECIMAL(19,5)不为null,Price DECIMAL(19,5)不为null,Quantity INT null,[订单]UNIQUEIDENTIFIER不为空,Product UNIQUEIDENTIFIER不为空,OrderDetail UNIQUEIDENTIFIER为空,主键(ID))我可以尝试运行NH3,但我认为它还没有完全发布?我的大多数属性名==列名-我可以使hbm更具可读性,感谢提示:)如果hbm为您生成正确的模式。。。是什么原因导致它生成我得到的时髦模式?我在NH2.x项目中也使用了SchemaExport,没有问题,尽管通常我有一个“public Guid Id{get;private set;}”或类似的PK。那应该没什么区别。NH3将很快释放。即使只是为了排除NH2.x的bug,我也会尝试一下。查看NH3的发行说明,我没有看到任何可以解决您问题的修复。引用同样是SQL关键字的表/列有一个修复程序,但老实说,根本不应该生成列名。我正在为我的域实体使用一个基类,它提供一个受保护的_persistenceID,我认为这与您的建议类似。有没有办法弄清楚是什么导致了额外的列?我尝试将该列重命名为
Order
,就像我的OrderDetails.hbm.xml文件中那样(请参见上面的编辑),但没有改变任何情况。我选择了OrderDetails,因为我希望能够引用Orders.OrderDetails.xxx而不是Orders.OrderID.xxx-但是如果这不是我非常乐意改变的方式。有趣的是,生成的模式甚至没有提到OrderDetails;包名称表示类中的集合属性。订单的架构不应包含对OrderDetails的任何引用。将列更改为Order时,生成的架构与原始版本相同?您的命名约定使得这有点难以遵循。我希望能够从订单到订单详细信息查看构成订单的所有记录。我还希望能够从OrderDetails转换为订单-订单可以有许多OrderDetails,而orderdetail属于订单。这是我的第一个NH项目,如果我有问题,请建议一个更好的方法。
<key column="OrderDetail" foreign-key="FK_OrderOrderDetails" />