Фон
Я использую устаревшую базу данных со всеми видами уродливых углов. Один бит - одитинг. Существует таблица, в которой перечислены комбинации таблиц и имен полей, которые должны иметь контрольный журнал. Например, если есть строка с именем «WORKORDER» для имени таблицы и «STATUS» для имени поля, то мне нужно добавлять строки в таблицу аудита всякий раз, когда свойство Workorder.Status изменяется в приложении. Я знаю подход: события NH или перехватчики, но у меня есть проблема, которую нужно выяснить, прежде чем я доберусь до этой стадии.
Вопрос
Что мне нужно знать, так это как получить список пар ключ / значение для одного постоянного класса, содержащего (а) имя поля базы данных и (б) имя связанного свойства в классе. Так что для моего примера у меня есть класс Workorder, связанный с таблицей (не удивительно) WORKORDER. У меня есть свойство в этом классе Workorder под названием CurrentStatus. Соответствующим свойством в таблице WORKORDER является STATUS. Заметили несоответствие между именем свойства и именем столбца таблицы? Мне нужно знать имя свойства для доступа к данным до и после аудита. Но мне также нужно знать имя вспомогательного столбца, чтобы я мог запросить глупую устаревшую таблицу AuditTheseColumns.
Что я пробовал
в своем приложении я изменяю Workorder.CurrentStatus с "TS" на "IP". Я просматриваю свою таблицу отслеживания аудита и вижу, что столбец WORKORDER.STATUS отслеживается. Поэтому после вызова Session.SaveOrUpdate (workorder) мне нужно найти свойство Workorder, связанное со столбцом STATUS, и выполнить Session.Save (auditRecord), сообщив ему старые ("TS") и новые ("IP") значения.
Насколько я могу судить, вы можете получить информацию о классе:
var fieldNames = new List<string>();
IClassMetadata classMetadata = SessionFactory(Resources.CityworksDatasource).GetClassMetadata(typeof(T));
int propertyCount = 0;
foreach (IType propertyType in classMetadata.PropertyTypes)
{
if (propertyType.IsComponentType)
{
var cp = (ComponentType)propertyType;
foreach (string propertyName in cp.PropertyNames)
{
fieldNames.Add(propertyName);
}
}
else if(!propertyType.IsCollectionType)
{
fieldNames.Add(classMetadata.PropertyNames[propertyCount + 1]);
}
propertyCount++;
}
и информация о таблице:
var columnNames = new List<string>();
PersistentClass mappingMeta = ConfigureCityworks().GetClassMapping(typeof(T));
foreach (Property property in mappingMeta.PropertyIterator)
{
foreach (Column selectable in property.ColumnIterator)
{
if (columnNames.Contains(selectable.Name)) continue;
columnNames.Add(selectable.Name);
}
}
Но не одновременно. Есть идеи? Я в недоумении, где искать дальше.