Я пытаюсь создать
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, если один из столбцов является общим для первичного ключа и внешнего ключа?