如何在FluentNhibernate中引用具有2个cols CompositeId的类中的2个cols CompositeId?

时间:2012-02-13 16:29:51

标签: c# fluent-nhibernate foreign-keys composite-key fluent-nhibernate-mapping

我正在尝试创建一个

public class BaseMap<T> : ClassMap<T>

我的申请。它应该支持本地化实体,它们的主键必须是Id和amp;语言:

CompositeId()
    .KeyProperty(x => x.Id)
    .KeyProperty(x => ((ILocalizedEntity)x).Language);

我想要的另一件事是一个能够引用另一个本地化类的本地化类。

我做了以下(经过大量研究,这就是我所拥有的):

    public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity
    {
        if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther)))
        {
            return base.References(memberExpression)
                .Columns("CategoryId")
                .Columns("Language");
        }

        return base.References(memberExpression);
    }

这在尝试插入时给了我IndexOutOfRange异常,原因是“Language”属性被映射了两次,但是DB中只有1个语言列,所以我这样做了:

    public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity
    {
        if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther)))
        {
            return base.References(memberExpression)
                .Columns("CategoryId")
                .Columns("Language")
                .Not.Update()
                .Not.Insert();
        }

        return base.References(memberExpression);
    }

哪个解决了IndexOutOfRange问​​题,但没有完成我想要的。因为它总是向列“CategoryId”插入NULL,因为我指定了Not.Insert()和Not.Update(),所以它没有!

现在,我处于一种情况,我希望它映射“CategoryId”而不是“语言”,因为它已经映射,因为它是ComposideId(主键)的一部分。

所以我尝试了这个:

    public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity
    {
        if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther)))
        {
            return base.References(memberExpression)
                .Columns("CategoryId")
                .Nullable()
                .Columns("Language")
                .Not.Update()
                .Not.Insert();
        }

        return base.References(memberExpression);
    }

网上钓鱼它不会只插入或更新“语言”而不是“CategoryId” - 但也没有运气。

我也尝试在PK中首先制作语言:

            CompositeId()
                .KeyProperty(x => ((ILocalizedEntity)x).Language)
                .KeyProperty(x => x.Id);

并将参考文献更改为:

            return base.References(memberExpression)
                .Columns("Language")
                .Not.Update()
                .Not.Insert()
                .Columns("CategoryId")
                .Nullable();

但仍然是“Not.Insert()”和“Not.Update()”正在影响“语言”和“ “类别ID”。

我尝试在“引用”调用之前映射“CategoryId”,如下所示:

            Map(memberExpression, "Language");
            return base.References(memberExpression)
            .......

但它失败了。

任何人都有任何想法,当一列与主键和外键共用时,如何从具有2列CompositeId的类引用具有2列CompositeId的类?

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,复合词的一部分是一个参考,我无法解决它与google,SO或我自己尝试2周,因此不喜欢它们。

有些情况CompositeId有它的位置,但在你描述的情况下很可能没有。获取实际语言值的简单字典和便利属性要简单得多,并且避免重复所有其他对每种语言都相同的属性。