【问题标题】:ActiveRecord won't load types from an assembly in GACActiveRecord 不会从 GAC 中的程序集加载类型
【发布时间】:2010-11-23 18:39:51
【问题描述】:

我想试用 ActiveRecord,因为它具有出色的会话/事务范围管理和良好的属性映射策略。我通常使用 Nhibernate + Fluent Nhibernate 来构建我的 DAL。

我陷入了这个奇怪的问题:ActiveRecord 不想从位于 GAC 中的程序集中加载我的类型......而 FluentNhibernate 可以。 这是失败的 ActiveRecord 初始化代码:

IDictionary properties = new Dictionary(); properties.Add("connection.driver_class", "NHibernate.Driver.SqlClientDriver"); properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect"); properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider"); properties.Add("connection.connection_string", "MY_CONNECTION_STRING"); properties.Add("proxyfactory.factory_class", typeof(NHibernate.ByteCode.Castle.ProxyFactoryFactory).AssemblyQualifiedName); InPlaceConfigurationSource source = new InPlaceConfigurationSource(); source.Add(typeof(ActiveRecordBase), properties);

ActiveRecordStarter.Initialize( 资源, 类型(人), 类型(汽车) );

包含“Person”和“Car”的程序集在 GAC 中,而 Fluent Nhibernate 可以加载它(即使在惰性集合中), ActiveRecord 无法加载并抛出以下异常:

à NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage) à NHibernate.Cfg.XmlHbmBinding.Binder.ClassForNameChecked(String name, Mappings mappings, String errorMessage) à NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass(XmlNode node, IDecoratable classMapping, PersistentClass model, IDictionary2 inheritedMetas) à NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(XmlNode node, HbmClass classSchema, IDictionary2 inheritedMetas) à NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(XmlNode parentNode, IDictionary`2 inheritedMetas) à NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node) à NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)

持久类 CFM.SearchServices.Finder.DAL.Entities.Person,未找到 CFM.SearchServices.Finder

有什么方法可以强制 ActiveRecord 提供 NHibernate 完全限定名称?

【问题讨论】:

    标签: nhibernate activerecord castle-activerecord


    【解决方案1】:

    不幸的是,目前 ActiveRecord 正在显式生成没有版本和公钥信息的类型名称,正如您在 MakeTypeName() 方法的源代码中看到的那样: https://github.com/castleproject/Castle.ActiveRecord/blob/master/src/Castle.ActiveRecord/Framework/Internal/Visitors/XmlGenerationVisitor.cs#L1398

    当然,您可以创建自己的 ActiveRecord 版本来创建完全限定的类型名称,在 https://github.com/castleproject/Castle.ActiveRecord/archives/master 下载源代码, 修改 MakeTypeName() 方法以创建完全限定的类型名称并重新构建/运行测试。

    【讨论】:

    • 感谢您的快速回答!...我将尝试从源代码构建我自己的 redist...希望 Castle 无论如何都能将修复程序放入主干。
    • 我的问题是:为什么首先在 GAC 中有这些程序集?这不过是麻烦。
    • 这些组件将在各种应用程序(asp.net 页面、控制台应用程序等)之间共享。通过将我的组件存储在 GAC 中,我使事情保持集中。它使更新和版本控制变得更加容易(通过策略绑定)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多