如何在Fluenthibernate中从具有2列CompositeId的类引用具有2列CompositId的类

本文关键字:2列 引用 CompositId 的类 CompositeId Fluenthibernate | 更新日期: 2023-09-27 18:24:28

我正在尝试创建一个

public class BaseMap<T> : ClassMap<T>

我的申请。它应该支持本地化实体,这些实体的主键必须是Id&语言:

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",但不映射"Language",因为它已经映射了,因为它是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);
    }

它不会只插入或更新"Language"而不是"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()"answers"Not.Update()"仍然影响着"Language"answers"Language";"类别ID"。

我尝试在调用"References"之前映射"CategoryId",如下所示:

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

但它失败了。

任何人都知道,当主键和外键共有1列时,如何从具有2列CompositeId的类引用具有2列的类CompositeId?

如何在Fluenthibernate中从具有2列CompositeId的类引用具有2列CompositId的类

我有一个类似的问题,compositeid的一部分是引用,我在两周内既无法通过谷歌、SO解决,也无法独自尝试,因此我不喜欢他们。

在某些情况下,CompositeId有它的位置,但在您描述的情况下,很可能没有。一个简单的字典和方便的属性来获得实际语言的值要简单得多,并且避免了复制所有其他属性,这些属性对每种语言都是相同的。