У меня очень расширяемое и модульное приложение. Я хочу расширить сопоставленные Entites из других сборок. Тем не менее, мне все еще нужно работать с базовыми классами.
Пример:
Отображение родительского класса в сборке A:
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Table("Persons");
Id(x => x.Id).GeneratedBy.Assigned();
}
}
Отображение дочернего класса в сборке B:
public class EmployeeMap : SubclassMap<Employee>
{
public EmployeeMap()
{
Table("Persons");
Extends(typeof(Person));
KeyColumn("Id");
LazyLoad();
HasMany<Assignments>(x => x.Assignments).KeyColumn("Id").Inverse().Cascade.AllDeleteOrphan().LazyLoad().NotFound.Ignore();
}
}
Теперь, когда я создаю Person в каком-то коде сборки A, он сохраняется как Employee в NHibernate. И это приводит к исключению приведения класса из-за того, что каждый раз, когда я сохраняю Person, пытаюсь обновить его в сборке A. Я не должен зависеть от Assembly B.
Мне нужно работать с родительским классом во всех методах сборки A. Дочерний класс используется только в других сборках.
Как я могу сопоставить что-то подобное? Как я могу сказать NHibernate просто сохранить его как родительский класс? Я использую SaveOrUpdate для сохранения сущностей; Как правильно расширить сущности и в то же время сохранить их в одной таблице без дискриминатора? Не можете NHibernate дифференцировать по типу объекта? Есть ли обходной путь?
Я не хочу указывать прокси-серверы вручную, так как мне пришлось бы создавать прокси для каждой сущности! Я не могу использовать шаблон посетителя из-за проблем с зависимостями.
Мне нужен способ расширить сопоставленную сущность в другой сборке без таких проблем! База данных является устаревшей, я не могу ее изменить. Как бы вы обойти эту проблему?