2010-03-10 3 views
1

Как я могу использовать общедоступные методы (не виртуальные) с NHibernate?NHibernate: как отключить виртуальные свойства класса?

У меня есть этот код:

public string crewNumber 
    { 
     get 
     { 
      return this.crewNumberField; 
     } 
     set 
     { 
      this.crewNumberField = value; 
     } 
    } 

Примечание все мои классы, свойства, методы и интерфейсы автоматически сгенерирован и я не хочу, чтобы изменить их вручную.

Приведенный выше код производит эту ошибку:

The following types may not be used as proxies: ... method get_crewNumber should be 'public/protected virtual'

Я вижу, что shold можно использовать простые общественные только свойства here:

In our example above, we've made the properties and the constructor public - but that's not a requirement for NHibernate - it can use public, protected, internal, or even private properties to persist your data.

Как отключить этот виртуальный по умолчанию?

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

Благодарности

+0

Я не думаю, что я когда-либо имел эту проблему, мои свойства не являются виртуальными. Можете ли вы отправить стек вызовов или более подробную информацию об ошибке? – Slavo

+0

Славо: какую версию NH вы используете? Такое поведение реализовано в определенной версии NH, возможно, вы используете более старую версию, которая не использовала динамические прокси-серверы? –

+0

Не проще ли изменить сценарий генерации кода? – Paco

ответ

5

Укажите, что динамические прокси не должны использоваться для этого класса, указав ленивым = false для сопоставления классов.

Как это:

<class name="MyClass" table="MyTable" lazy="false"> 
</class> 

Это означает Offcourse, что вы не можете использовать динамические прокси с NHibernate. Чтобы быть более ясным: - при получении экземпляра вашего класса, который может использовать динамические прокси, вы получите «пустой экземпляр». То есть, NHibernate еще не будет получать данные из БД. Вы получите объект who'se Id, который будет заполнен, но другие свойства отсутствуют. Только когда вы получаете доступ к свойству, NHibernate будет загружать данные из БД. Вот почему свойства должны быть виртуальными, потому что NHibernate будет создавать подкласс вашего класса внутри страны и переопределять свойства, чтобы он мог добиться такого поведения.

Я всегда указываю 'lazy = false' на моем сопоставлении классов, так как я не хочу иметь виртуальные свойства по причине, связанной с инфраструктурой, а не «связанной с доменом».

(Обратите внимание, что это не имеет никакого отношения к ленивой загрузке ассоциаций, но при этом они могут быть ленивы загружены, если вы не используете динамические прокси).

+3

Не знал этого. Мысль о том, что NHibernate заставляет «все быть виртуальным» по умолчанию. :) –

+0

спасибо, что мне нужно. – Wolfie

+0

спасибо Я использую свободный, так что если кто-то нуждается синтаксис: .Mappings (м => { m.FluentMappings .AddFromAssemblyOf ().ExportTo (@ "C: \ temp") .Conventions.Add (FluentNHibernate.Conventions.Helpers.DefaultLazy.Never()); – Wolfie

0

Положите lazy="false" на отображение класса:

<class name="MyClass" table="MY_TABLE" lazy="false">