为啥 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 过滤器的语法?