NHibernate proxyfactory

时间:2013-02-25 21:24:55

标签: nhibernate

我已经通过Nuget将NHibernate.3.3.2.4000安装到我的MVC3项目中,并在没有proxyfactory.factory_class的情况下进行了配置:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>         
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect, NHibernate</property>
        <property name="connection.connection_string_name">db</property>
        <property name="adonet.batch_size">50</property>
        <property name="current_session_context_class">web</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        <mapping assembly="TheWorkshop.DomainModel" />
    </session-factory>
</hibernate-configuration>

但是像这样我收到以下错误:

  

以下类型不能用作代理:   TheWorkshop.DomainModel.Contact:方法set_DateAdded应该是'public / protected virtual'或'protected internal virtual'

DateAdded属性私自设置DateAdded值

 public virtual DateTime DateAdded
 {
     get { return _dateAdded; }
     private set { _dateAdded = DateTime.Now; }
 }

我并不特别想让setter公开,我的想法是DateAdded会自动设置。

我看过帖子,建议我可以将proxyfactory.factory_class设置为

<property name="proxyfactory.factory_class">
    NHibernate.ByteCode.Castle.ProxyFactoryFactory, 
    NHibernate.ByteCode.Castle
</property>

但Nuget安装没有删除对NHibernate.ByteCode.Castle的任何引用,当我尝试Install-Package NHibernate.Castle失败时

  

安装失败。回滚...
  Install-Package:已经引用了更新版本的'NHibernate'   在行:1 char:16
  + Install-Package&lt;&lt;&lt;&lt; NHibernate.Castle
      + CategoryInfo:NotSpecified:(:) [Install-Package],InvalidOperationException
      + FullyQualifiedErrorId:NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand

所以我想我可以下载NHibernate版本,但这似乎错了...... 我应该做什么,类似的问题NuGet: NHibernate, Castle.Core 3.0 and where is ProxyFactoryFactory?说我不需要在较新版本中配置proxyfactory.factory_class

  

NHibernate的最新版本不需要配置代理工厂   默认情况下使用内部适配器,旧适配器不再是项目的一部分。

1 个答案:

答案 0 :(得分:3)

  1. 除非你像第二部分那样使用Castle.Core代理工厂,否则你不一定需要Castle.Core。 NHibernate默认带有它自己的代理工厂,这是你第一次有的,所以我不会评论Castle.Core部分(我认为它不适用于最新的nhibernate)
  2. 您可以通过告诉nhibernate您不想延迟加载类(默认情况下启用)来解决您的错误。如何执行此操作将根据您的映射方式而有所不同。
  3. 你可以通过使setter受保护而不是私有来摆脱错误。
  4. 我认为你的二传手实际上并不像你认为的那样工作。除非您实际使用值设置该属性,否则它将永远不会获得当前日期/时间,在这种情况下,您可能只需使用DateTime.Now而不是您拥有它来设置它。此外,当nhibernate加载时,您将获得当前日期而不是创建它的实际日期/时间。你应该在构造函数中设置值,而不是像你一样劫持setter。