У меня была проблема с NHibernate, когда я забыл отобразить одно свойство класса.Как найти неотображаемые свойства в сопоставленном классе NHibernate?
очень упрощенный пример:
public class MyClass
{
public virtual int ID { get; set; }
public virtual string SomeText { get; set; }
public virtual int SomeNumber { get; set; }
}
... и файл отображения:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyAssembly"
namespace="MyAssembly.MyNamespace">
<class name="MyClass" table="SomeTable">
<property name="ID" />
<property name="SomeText" />
</class>
</hibernate-mapping>
В этом простом примере, вы можете увидеть проблему сразу:
есть свойство названный «SomeNumber» в классе, но не в файле сопоставления.
Таким образом, NHibernate не будет отображать его, и он всегда будет равен нулю.
Настоящий класс имел намного больше свойств, поэтому проблему не так-то просто было увидеть, и мне потребовалось некоторое время, чтобы выяснить, почему SomeNumber всегда возвращал нуль, хотя я был на 100% уверен, что значение в базе данных было! = ноль.
Итак, вот мой вопрос:
Есть некоторые простой способ выяснить это с помощью NHibernate?
Как предупреждение компилятора при сопоставлении класса, но некоторые из его свойств отсутствуют.
Или какой-то запрос, который я могу запустить, который показывает мне unmapped свойства в сопоставленных классах ... вы получаете идею.
(Плюс, это было бы неплохо, если бы я мог исключить некоторые устаревшие столбцы, которые я действительно не хотят отображенные.)
EDIT:
Хорошо, я смотрел на все, что предложенная и решил идти с API метаданных ... это выглядит проще всего для меня.
Теперь, когда я знаю, что искать, я нашел несколько примеров, которые помогли мне начать работу.
До сих пор у меня есть это:
Type type = typeof(MyClass);
IClassMetadata meta = MySessionFactory.GetClassMetadata(type);
PropertyInfo[] infos = type.GetProperties();
foreach (PropertyInfo info in infos)
{
if (meta.PropertyNames.Contains(info.Name))
{
Console.WriteLine("{0} is mapped!", info.Name);
}
else
{
Console.WriteLine("{0} is not mapped!", info.Name);
}
}
Она почти работает, за исключением одной вещи: IClassMetadata.PropertyNames возвращает имена всех свойств кроме идентификатор.
Чтобы получить идентификатор, мне нужно использовать IClassMetadata.IdentifierPropertyName.
Да, я мог бы сохранить .PropertyNames в новом массиве, добавить .IdentifierPropertyName к нему и выполнить поиск , что массив.
Но это выглядит странно для меня.
Нет ли лучшего способа получить все отображенные свойства, включая ID?
Именно по этой причине я написал «тестер отображения». Но это довольно много кода. он проверяет, может ли объект быть сохранен и извлечен без потери данных. Может быть, я получу прием и найду время, чтобы выпустить его когда-нибудь. –
+1 для показа мне, как получить идентификатор имя_пользователя. Именно то, что я искал! –