Подтвердить что ты не робот

NHibernate: перейти к полям или недвижимости?

Когда вы создаете файлы сопоставления, сопоставляете ли вы свои свойства с полями или свойствами:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Foo" namespace="Foo.Bar" >
  <class name="Foo" table="FOOS" batch-size="100">
    [...]
    <property name="FooProperty1" access="field.camelcase" column="FOO_1" type="string" length="50" />
    <property name="FooProperty2" column="FOO_2" type="string" length="50" />
    [...]
  </class>
</hibernate-mapping>

Конечно, пожалуйста, объясните, почему:)

Обычно я сопоставляю свойства, но сопоставление с полями позволяет включить некоторую "логику" в getters/setters свойств.

Является ли это "плохой" для сопоставления с полями? Есть ли наилучшая практика?

4b9b3361

Ответ 1

Я сопоставляю свойства. Если я нахожу это необходимым, я сопоставляю SETTER с полем. (обычно через нечто вроде "access = field.camelcase" ).

Это позволяет мне иметь интересные запросы, например. "from People Where FirstName =" John "вместо того, что" от People Where firstName/_firstName ", а также избегайте логики setter при увлажнении моих объектов.

Ответ 2

Свойства также полезны в том случае, если вам нужно делать что-то напуганное с данными по мере их поступления и хранения. Этого обычно следует избегать, но некоторые редкие деловые случаи или устаревшая поддержка иногда требуют этого.

(Просто помните, что если вы каким-то образом преобразуете данные, когда они возвращаются с помощью getter, NHibernate будет (по умолчанию) использовать возврат из получателя и сохранить его таким образом обратно в базу данных, когда сеанс покраснел/закрыт. Убедитесь, что это то, что вы хотите.)

Ответ 3

Я сопоставляю свойствам, я не сталкивался с ситуацией, когда я мог бы отобразить поле... и когда я увеличу свой B.O. дизайн для потребности. Я думаю, что это позволяет улучшить архитектуру.

Ответ 4

Я сопоставляю свойства, потому что я использую автоматические свойства.

За исключением коллекций (например, set s). Я сопоставляю поля (access="field.camelcase-underscore"), потому что у меня нет публичных свойств, которые выставляют их, но методы.

Ответ 5

Нулевые объекты

Отображение полей может быть полезно, если вы реализуете нулевой шаблон объекта, если ваши классы. Поскольку это невозможно выполнить (легко) при сопоставлении с Properties. В итоге вы должны хранить поддельные объекты в базе данных.

HQL

Я не был уверен, что с запросами HQL вам нужно было изменить имена свойств, если вы используете подход с доступом к полям. т.е. если у вас есть <property name="FirstName" access="field.camelcase" />, я думал, что вы все равно можете написать "From Person where FirstName = :name";, поскольку он будет использовать имя свойства еще.

Дальнейшее обсуждение стратегий полей и объекта Null можно найти здесь.

Производительность

В отношении производительности поля vs свойство на блог Джона Чепмена Похоже, что производительность невелика при работе с результирующими наборами с малой величиной.

Таким образом, каждый подход имеет определенные преимущества, которые могут быть полезны в зависимости от сценария (доступ к полям позволяет читать только получатели, нет необходимости в сеттерах, доступ к свойствам работает, когда из вашего poco ничего не требуется и, по-видимому, является дефактовым подходом. и т.д.)

Ответ 6

Я согласен с ответами выше. Как правило, сопоставляйте свойства почти для всех, а затем сопоставляйте их с полями для сборщиков.
Единственное другое место, которое вы хотите сопоставить с полями, - это когда у вас есть что-то:

public class AuditableEntity
{
   /*...*/
   DateTime creationDate = DateTime.Now;
   /*...*/
   public DateTime CreationDate { get { return creationDate; } }
}

Ответ 7

Я сопоставляю непосредственно полям, которые позволяют мне использовать средства определения свойств для отслеживания состояния грязной собственности.