Как сослаться на класс с 2 столбцами CompositeId из класса с 2 столбцами CompositeId в FluentNhibernate? - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь создать

public class BaseMap<T> : ClassMap<T>

для моего приложения. Он должен поддерживать локализованные объекты, первичный ключ которых должен быть и Id & Language:

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" было отображено дважды, но в БД был только 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, но не выполнило то, что я хочу. потому что он всегда вставляет NULL в столбец "CategoryId", потому что я указал 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" - но и там не повезло.

Я также пытался сначала создать язык в ПК:

            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 ()» влияют на «Language» и «CategoryId».

Я попытался отобразить «CategoryId» перед вызовом «References», например:

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

Но это не удалось.

У кого-нибудь есть идеи, как ссылаться на класс с 2 столбцами CompositeId из класса с 2 столбцами CompositeId, если один из столбцов является общим для первичного ключа и внешнего ключа?

1 Ответ

0 голосов
/ 17 февраля 2012

У меня была похожая проблема с частью составного слова, являющегося ссылкой, и я не мог решить ее ни с помощью Google, так и не пытался самостоятельно в течение 2 недель, отсюда и неприязнь к ним.

В некоторых случаях CompositeId имеет свое место, но в случае, который вы описываете, скорее всего, нет. Простой словарь и вспомогательные свойства для получения значения для реального языка намного проще и позволяют избежать дублирования всех других свойств, которые одинаковы для каждого языка.

...