我们有一个Fluent NHibernate映射测试,它在我们的本地机器上传递,但是当我们检入TFS时,测试在构建服务器上失败了。我们正在使用MSTest。我们得到的错误是:
NHibernate.Bytecode.UnableToLoadProxyFactoryFactoryException:无法在配置代理工厂类时加载类型'NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle'。 可能的原因是: - 未部署NHibernate.Bytecode提供程序程序集。 - 用于初始化session-factory部分的'proxyfactory.factory_class'属性的typeName格式不正确。
解决方案: 确认您的部署文件夹包含以下程序集之一: NHibernate.ByteCode.LinFu.dll NHibernate.ByteCode.Castle.dll ---> System.IO.FileNotFoundException:无法加载文件或程序集“NHibernate.ByteCode.Castle”或其依赖项之一。系统找不到指定的文件.WRN:程序集绑定日志记录已关闭。 要启用程序集绑定失败日志记录,请将注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)设置为1。 注意:程序集绑定失败日志记录会导致一些性能损失。 要关闭此功能,请删除注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog]。
我们检查了drop文件夹,NHibernate.Bytecode.Castle.dll就在那里。我们有对Castle.Core,Castle.DynamicProxy2,Iesi.Collections,log4net,NHibernate和NHibernate.ByteCode.Castle的dll和引用。我们已经使用drop文件夹中的命令提示符通过MSBuild运行测试,但仍然会出现错误。我们的流畅映射看起来像这样(NHibernateConfig.MappingConfiguration())调用实际的映射,自动化):
Fluently.Configure() .Database(SQLiteConfiguration.Standard.ShowSql()。InMemory()) .Mappings(NHibernateConfig.MappingConfiguration()) .BuildConfiguration();
为什么会出现这种情况?
答案 0 :(得分:11)
如果我记得字节码组件是如何工作的,那么实际上并没有对它们进行有用的引用。也就是说,您没有在代码中专门使用其中一个类。结果,“智能”参考复制导致这些不被引入。(我可能会这样做,对不起)。
为了解决这个问题,你可以:a)使相应的字节码组件成为一个复制始终内容引用(meh)或b)创建一个愚蠢的小类(私有静态),引用实际字节码组件中的任何单个类(meh + 1)。
我确信还有另一种方法可以强制推荐引用,但这两种应该是最简单的20秒解决方案。
答案 1 :(得分:6)
有同样的问题,必须在执行Fluently.Configure的类中添加引用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Automapping;
using FluentNHibernate.Conventions.Helpers;
using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.AcceptanceCriteria;
using FluentNHibernate.Conventions.Inspections;
using FluentNHibernate.Conventions.Instances;
using FluentNHibernate.MappingModel;
using FluentNHibernate;
**using NHibernate.ByteCode.Castle;**
namespace CESP_NotifyLib
{
class SessionFactoryController
{
public SessionFactoryController()
{
}
public ISessionFactory GiveFactory()
{
return CreateSessionFactory();
}
**private static void ReferByteCode(){
//Just to make sure the ByteCodeCastle is loaded
ProxyFactory fake = new ProxyFactory();
}**
private static ISessionFactory CreateSessionFactory()
{
ReferByteCode();
var cfg = new NotifyFluentNhibernateConfiguration();
return Fluently.Configure()
.Database(
FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
.ConnectionString("Server=[MYSERVERIPADRESS]\\DBSERVER;Database=NotifyTest;User ID=NHibernateTester;Password=[MYPASSWORD];Trusted_Connection=False;")
)
.Mappings(m => {
m.AutoMappings
.Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg));
} )
.BuildSessionFactory();
}
}
}
答案 2 :(得分:3)
一些有用的提示。
您可以在测试类上放置DeploymentItem属性。这将复制您需要的DLL。您还必须在项目引用中引用DLL。
[TestClass]
[DeploymentItem("NHibernate.ByteCode.LinFu.dll")]
[DeploymentItem("NHibernate.ByteCode.LinFu.xml")]
public class Accounts
通过将/ [myapp] / bin / debug文件夹与/ TestResults / [TestRunDate]文件夹进行比较,可以找到丢失的DLL。
我正在使用VS 2012.这适用于MSTest。
答案 3 :(得分:2)
添加对NHibernate.ByteCode.Castle.dll的引用为我解决了这个问题。
答案 4 :(得分:2)
来自Fluent NHibernate wiki: 缺少ProxyFactory配置
CreateSessionFactory中的数据库配置缺少ProxyFactoryFactory调用。由于问题154是一个wontfix,一行
.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")
将需要添加到数据库配置调用。我看起来像这样:
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile("firstProject.db")
.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"))
答案 5 :(得分:1)
实际上,需要'ReferByteCode'方法,只有参考没有帮助。它是一个值得McGyver的黑客,但它确实有用。
答案 6 :(得分:0)
大家,如果你有这个问题我建议你下载其他城堡包。在我的情况下问题是,在我下载的包中实际上没有实现接口(IProxyFactory或类似的东西)所以我删除了NHibernate.ByteCode.Castle和NHibernate.ByteCode.Search并安装了NHibarnate.Castle包解决了我的所有问题日问题。 我正在使用NuGet Package Manager!
并记住Fusion Log就是你的朋友!