2

我正在使用 NHibernate 和 Fluent NHibernate 为域对象创建映射文件(尽管我不在乎答案是否使用流利的 NHibernate 或 xml hbm 语法)。而且我在弄清楚如何指定表示域对象中的组件的一组列是唯一的时遇到了麻烦。

这是域对象:

public class SpaceLocation
{
        public SpaceCoordinate Coordinates { get; set; }
        public SpaceObject AtLocation { get; set; }
}

这是我遇到问题的组件:

public struct SpaceCoordinate
{
        public int x { get; set; }
        public int y { get; set; }
        public int z { get; set; }
}

不要担心SpaceObject AtLocation这个问题的目的。

所以我知道如何用 SpaceCoordinate 制作一个组件,但我想制作它,以便不能重复插入同一组坐标。为了做到这一点,我想让组件作为一个整体独一无二。

为了让您了解我正在尝试的方向,我将向您展示我对映射类的了解:

public class SpaceLocationMap : ClassMapWithGenerator<SpaceLocation>
    {
        public SpaceLocationMap()
        {

            Component<SpaceCoordinate>(x => x.Coordinates, m => 
            {
                m.Map(x => x.x);
                m.Map(x => x.y);
                m.Map(x => x.z);
            });
        }
    }

这个 Fluent NHibernate 映射的问题在于它没有将唯一约束共同应用于 SpaceCoordinate 的值。请注意,我并不是要单独将每个设置为唯一的,那样限制性太强了。

那么,您将如何使用 hbm 或 fluent 映射文件进行映射呢?

任何帮助将不胜感激,感谢阅读!

4

2 回答 2

2

m4bwav 在 hbm 映射中是正确的;但是,在您编写问题时,Fluent NHibernate 对此没有支持。我刚刚提交了一个Unique向组件映射添加方法的修复程序。

Component<SpaceCoordinate>(x => x.Coordinates, m => 
{
  m.Map(x => x.x);
  m.Map(x => x.y);
  m.Map(x => x.z);
}).Unique();

因此,您需要更新 Fluent NHibernate 的副本。如果由于某种原因您无法做到这一点,您可以使用该SetAttribute方法破解它。

Component<SpaceCoordinate>(x => x.Coordinates, m => 
{
  m.Map(x => x.x);
  m.Map(x => x.y);
  m.Map(x => x.z);
}).SetAttribute("unique", "true");
于 2009-01-26T16:15:23.490 回答
0

我相信答案是这样的:

<class name="SpaceLocation" table="SpaceLocation">
    <property name="AtLocation" type="SpaceObject"/>
    <component name="Coordinates" class="SpaceCoordinate" unique="true">
        <property name="x"/>
        <property name="y"/>
        <property name="z"/>
    </component>
</class>

但我还没有检查。现在如何在流利的nhibernate中做到这一点?

于 2009-01-26T15:32:13.360 回答