2

我已经NHibernate.3.3.2.4000通过 Nuget 安装到我的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 应为“公共/受保护虚拟”或“受保护内部虚拟”

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>

NHibernate.ByteCode.Castle但是当我尝试安装 Nuget 时,安装并没有取消对 的任何Install-Package NHibernate.Castle引用

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

所以我想我可以降低 NHibernate 版本,但这似乎是错误的......我应该怎么做,一个类似的问题NuGet:NHibernate,Castle.Core 3.0 以及 ProxyFactoryFactory 在哪里?说我不需要proxyfactory.factory_class在较新的版本 中配置

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

4

1 回答 1

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