Недавно мы обновили до последней версии NHibernate (3.3.3.4001), и у меня возникла проблема, которой не было в NHibernate 2.1.2.4000. Это заставляет меня думать, что это может быть проблемой с новым встроенным провайдером байт-кода.Nhibernate: свойство readonly вызывает большую нагрузку
Рассмотрим следующие отображения:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Foo.Core.Domain" assembly="Foo.Core" default-access="property">
<class name="EntityA" table="EntityA" lazy="true">
<id name="Id" column="EntityAId">
<generator class="native" />
</id>
<many-to-one name="EntityB" column="EntityBId" class="EntityB" not-null="true" />
<many-to-one name="EntityC" column="EntityCId" class="EntityC" not-null="true" access="readonly" insert="true" update="false" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Foo.Core.Domain" assembly="Foo.Core" default-access="property">
<class name="EntityB" table="EntityB" lazy="true">
<id name="Id" column="EntityBId">
<generator class="native" />
</id>
<many-to-one name="EntityC" column="EntityCId" class="EntityC" not-null="true" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Foo.Core.Domain" assembly="Foo.Core" default-access="property">
<class name="EntityC" table="EntityC" lazy="true">
<id name="Id" column="EntityCId">
<generator class="native" />
</id>
</class>
</hibernate-mapping>
Вот мое определение класса EntityA:
Public Class EntityA
Public Overridable Property Id As Integer
Public Overridable Property EntityB As EntityB
Public Overridable ReadOnly Property EntityC As EntityC
Get
Return If(EntityB IsNot Nothing, EntityB.EntityC, Nothing)
End Get
End Property
End Class
Проблема возникает, когда я называю Session.Get для экземпляра EntityA - это сразу вызывает выберите, который будет выпущен для соответствующего объекта EntityB:
Session.Get(Of EntityA)(id) ' Causes the EntityB that EntityA references to be loaded as well.
M y лучше всего предположить, что поставщик байт-кода вызывает мое свойство readtoly «EntityC», которое будет оцениваться при создании прокси-сервера, что заставляет нагрузку связанного EntityB.
Есть ли какой-либо способ избежать чрезмерной нагрузки с использованием этого типа модели с NHibernate 3.3.3?
Извините, если глупый комментарий, но, в соответствии с кодом свойства EntityA.EntityC, я не вижу точки EntityA.EntityC, находящейся в сопоставлении (не знал, что вы можете определить явное свойство readonly в VB.Net в то время как AFAIK, вы не можете на C#) – jbl
Чтобы быть ясным, в моей реальной реализации есть смысл в этом (это просто надуманный пример, чтобы проиллюстрировать проблему). Мне нужен столбец для денормализации (см. составление отчетов). – DanP
Насколько я понимаю, для простоты вы создали этот ясный пример. Я был просто озадачен этими двумя определениями, с другой семантикой, EntityA.EntityC, один в сопоставлении и один в коде, и задавался вопросом о ожидаемом поведении прокси-класса. Может быть, вы можете пролить свет на это, поскольку это, кажется, ядро вашей проблемы. – jbl