Я пытаюсь создатьКак ссылаться на класс с 2 cols CompositeId из класса с 2 cols CompositeId в FluentNhibernate?
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 исключения при попытке вставить, причина в том, что свойство «Язык» отображался дважды, но был только один язык столбца в БД, так что я сделал это:
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», но не «Язык», потому что он уже отображен, так как он является частью 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» - но не повезло там.
Я также попытался сделать язык первым в ПК:
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()" и «Не .Update() "влияет на оба" Язык "&" CategoryId ".
Я попытался картографирования "CategoryId" перед вызовом "Ссылки", как это:
Map(memberExpression, "Language");
return base.References(memberExpression)
.......
Но это не удалось.
У любого есть идея, как ссылаться на класс с 2 столбцами CompositeId из класса с 2 столбцами CompositeId, когда 1 из столбцов является общим для первичного ключа и внешнего ключа?
избегать составных элементов как можно больше.следующее также избегает дублирования http://stackoverflow.com/a/5431842/671619 – Firo
Тем не менее, если я хочу использовать их, почему это так сложно? Если вы думаете о том, что правильно архитектурно в программе и в db, составной идентификатор иногда является лучшим выбором ... не так ли? –