Fluent nhibernate 有许多非空外键

Fluent nhibernate 有许多非空外键,fluent-nhibernate,Fluent Nhibernate,我有两个类(简化的,例如): 问题是我不希望[DataContainer]INT null,而是希望它不允许null [DataContainer] INT not null 我认为.Not.KeyNullable()可以做到这一点,但它似乎不起作用 谢谢。我得到了完全相同的映射和相同的结果,但是看看Fluent生成的hbm.xml,它看起来做了它能做的。集合映射如下所示(注意“key”元素上的“notnull”属性): 因此,我认为这是一个NHibernate问题,而不是一个流畅的问题。

我有两个类(简化的,例如):

问题是我不希望[DataContainer]INT null,而是希望它不允许null

[DataContainer] INT not null
我认为.Not.KeyNullable()可以做到这一点,但它似乎不起作用


谢谢。

我得到了完全相同的映射和相同的结果,但是看看Fluent生成的hbm.xml,它看起来做了它能做的。集合映射如下所示(注意“key”元素上的“notnull”属性):


因此,我认为这是一个NHibernate问题,而不是一个流畅的问题。以下内容摘自最新的NHibernate参考资料第6.4章(3.0.0,但我确信2.1.2也是如此)

非常重要的注意:如果关联的列被声明为NOTNULL,那么NHibernate在创建或更新关联时可能会导致违反约束。为了防止此问题,必须使用双向关联,将多值端(集合或包)标记为reverse=“true”。请参阅本章后面关于双向关联的讨论


因此,我猜测NHibernate在为该映射生成DDL时只是忽略了“notnull”属性,解决方案是按照上面的建议使关联双向(肯定有效,但可能不适合您的场景)或者与空列一起使用。

我有相同的映射,并通过使关系双向(如Yhrn所建议的)来解决它,然后通过向映射添加constrated()来强制执行外键约束。ForeignKey()声明:

在数据类中:

 this.HasOne(x => x.DataContainer).Cascade.All().Constrained().ForeignKey();
生成的SQL中的列仍然可以为空,但已添加外键:

ALTER TABLE [dbo].[Data]  WITH CHECK ADD  CONSTRAINT [FK_DataToDataContainer] FOREIGN KEY([Id])
REFERENCES [dbo].[DataContainer] ([Id])
GO

ALTER TABLE [dbo].[Data] CHECK CONSTRAINT [FK_DataToDataContainer]
GO

你用的是什么版本的Fluent?@Phil,很抱歉刚才看到你的评论。。。使用Fluent 1.1和NHibernate 2.1.2。我遇到了完全相同的问题,并尝试按照上面的建议解决(添加双向关系并将容器端设置为反向),但我的外键仍然可以为空。有人能提供更多关于解决方案的细节吗?正如我在对你的答案的评论中所写的:使用References()。Not.Nullable()。嗨,这里不应该使用HasOne。它只适用于一对一关系,这是一对多关系。而是使用References()。Not.Nullable()。实际上,您所做的映射将只支持每个数据容器一个数据。数据表中的主键也是DataContainer表的外键,即它与共享主键之间存在严格的一对零/一关系。
[DataContainer] INT not null
<bag cascade="all" name="Items" mutable="true">
  <key foreign-key="FK_MyEntity2_MyEntity1" not-null="true">
    <column name="MyEntity1_Id" />
  </key>
  <one-to-many class="MyNs.MyEntity2, MyAssembly, Version=0.4.700.0, Culture=neutral, PublicKeyToken=null" />
</bag>
 this.HasOne(x => x.DataContainer).Cascade.All().Constrained().ForeignKey();
ALTER TABLE [dbo].[Data]  WITH CHECK ADD  CONSTRAINT [FK_DataToDataContainer] FOREIGN KEY([Id])
REFERENCES [dbo].[DataContainer] ([Id])
GO

ALTER TABLE [dbo].[Data] CHECK CONSTRAINT [FK_DataToDataContainer]
GO