У меня есть класс, похожий на следующий (имена nb! были изменены для защиты невинных):
public class Person
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual DateTime Birthday { get; set; }
public virtual TimeSpan Age { get { return DateTime.Now - this.Birthday; } }
}
Я использую Fluent NHibernate для настройки моего сопоставления:
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Birthday);
}
}
Проблема заключается в том, что это исключает исключение:
Не удалось найти сеттер для свойства "Возраст" в классе "Человек"
Если Age не отмечен виртуальным, я получаю:
Следующие типы не могут использоваться как прокси: Лицо: метод get_Age должен быть "общедоступным/защищенным виртуальным" или 'protected internal virtual'
Конечно, он не может найти сеттера, и он не должен! Как я могу сделать это отображение?
Реальный вопрос для меня - это почему бедный NHibernate пытается сопоставить свойство Age вообще? Это даже не в вашем картографировании. Я использовал только более ранние версии свободного NHibernate, до полной функциональности автоматического сопоставления, и у меня никогда не было этой проблемы.
Я подозреваю, что либо ваши соглашения приводят к тому, что он пытается сопоставить Age, либо у вас есть возможность автоматического сопоставления, которое противоречит вашему ручному сопоставлению.
Также имейте в виду, что Fluent NHibernate несколько недавно изменил соглашения. Поэтому я хотел бы посмотреть следующую документацию:
http://wiki.fluentnhibernate.org/show/Conventions
http://wiki.fluentnhibernate.org/show/ConvertingToNewStyleConventions