为啥 Fluent NHibernate 会忽略我对组件的唯一约束?

Posted

技术标签:

【中文标题】为啥 Fluent NHibernate 会忽略我对组件的唯一约束?【英文标题】:Why is Fluent NHibernate ignoring my unique constraint on a component?为什么 Fluent NHibernate 会忽略我对组件的唯一约束? 【发布时间】:2011-04-23 12:38:48 【问题描述】:

在我的地图中,我有:

Component(
    x => x.ExposureKey,
    m => 
        m.Map(x => x.AsOfDate).Not.Nullable();
        m.Map(x => x.ExposureId).Length(30).Not.Nullable();
    
).Unique();

HBM 的相关输出是

<component name="ExposureKey" insert="true" update="true" optimistic-lock="true" class="Some.Namespace.CreditExposureKey, Some.Namespace, Version=0.0.0.0, Culture=neutral, PublicKeyToken=aaaaaaaaaaaaaaaa">
    <property name="AsOfDate" type="System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="AsOfDate" not-null="true"/>
    </property>
    <property name="ExposureId" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="ExposureId" length="30" not-null="true"/>
    </property>
</component>

unique="true" 显然从 component 定义中丢失了。

为什么会这样?

【问题讨论】:

【参考方案1】:

您使用的是最新版本的 Fluent NHibernate 吗?根据James Gregory(Fluent NHibernate 贡献者)的说法,它应该可以工作。

// Else, try this hack:
Component(x => x.ExposureKey, m => 

    m.Map(x => x.AsOfDate).Not.Nullable();
    m.Map(x => x.ExposureId).Length(30).Not.Nullable();
).SetAttribute("unique", "true");

最好检查生成的 SQL 是否确实设置了 Unique 属性,即使 hbm 映射文件没有(可能是一个小错误)。

【讨论】:

我会尝试更新的版本(我使用的是 build 685,而当前是 694)。我认为SetAttribute 已被删除。生成的 SQL 没有设置 unique 属性(它不应该,因为它不在映射中!)。 更新到最新版本 (694)。还是不行。 @Jason:这很奇怪 ++,我在家的 VS 表现得很疯狂。希望在我尝试在工作中复制它之前(大约 12 小时)你会得到答案。这是什么,MSSQL/mysql MS SQL 和 SQLite。我认为这并不重要,因为这是从 Fluent NHibernate 到 NHibernate 映射的问题,而不是从 NHibernate 通过 SchemaExport 映射到数据库命令的问题。 @Jason:只是想知道这样我明天就可以在最近的环境中进行测试。 :P

以上是关于为啥 Fluent NHibernate 会忽略我对组件的唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 Fluent NHibernate 不要映射类属性

在使用fluent-nhibernate配置nhibernate时,为什么会出现MissingMethodException?

用 Fluent Nhibernate 定义 NHibernate 过滤器的语法?

Fluent NHibernate - NHibernate.QueryException:无法解析属性

Fluent 映射和 NHibernate Xml 配置

如何使用 Fluent 设置 NHibernate.Burrow?