Свободное автоматическое отображение Nhibernate. Ассоциация относится к несопоставленному базовому классу.
У меня следующая ситуация:
AssemblyX с сущностями db ссылается на внешнюю сборку Y и использует ее классы в качестве базовых классов. AssemblyX добавляет некоторые свойства навигации, если это необходимо.
Конечно, я могу скопировать все это и использовать autopper для решения моей проблемы, но у меня есть причина наследовать существующие сущности.
Так что я Foo {}
класс в AssemblyY и создать Bar: Foo {}
в сборке X. Настройте беглое автоматическое отображение, чтобы игнорировать Foo (.IgnoreBase<Foo>())
, Все работает хорошо Но у сборки Y есть другая сущность Rab
(который покрыт беглым автоотображением), который имеет свойство навигации, которое относится к Foo
, Это вызывает исключение: "Ассоциация из таблицы Rab относится к несопоставленному классу: Foo".
public class Foo // .IgnoreBase<Foo>() - I require only derived Bar in DB
{
public virtual Guid Id {get; set;}
}
public class Bar: Foo
{
public virtual Guid Id {get; set;}
// Some new properties
}
public class Rab
{
public virtual Guid Id {get; set;}
public virtual Foo Foo // reference to unmapped class, I could not change type to Bar (external assembly)
}
Как я могу решить это. Я пытался унаследовать Раб и создать new Foo
свойство с типом бара, но безуспешно.
Спасибо заранее за любые советы.
1 ответ
Вы можете использовать пользовательский IAutomappingConfiguration, чтобы определить, какой тип или член должен быть отображен:
class MyConfig : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return !(typeof(Foo)).IsAssignableFrom(type);
}
public override bool ShouldMap(Member member)
{
return !(typeof(Foo)).IsAssignableFrom(member.PropertyType); }
}
Тогда вы можете использовать свой конфиг так:
AutoPersistenceModel model = new AutoPersistenceModel(new MyConfig());
И наконец:
Fluently.Configure()
.Mappings(m => m.UsePersistenceModel(model))
.BuildSessionFactory();