几日前又将一个asp.net的旧项目搬迁至linux下,该项目是基于asp.net 4.0 + Nhibernate + FluentNhibernate实现的,在迁移的过程中碰到一个少见的问题,爬了很多文,包括中文,英文,最后在某日文网站(靠google翻译)上找到答案,可谓相当蛋疼,特些记录
先介绍下,要迁移至的环境是centos6.5 + MONO + Jexus
该情况发生在Nhibernate + mono下,但不是一定会发生,原先我移迁的几个项目里,也有一些是采用Nhibernate的,就没发生这样的问题
初始:
迁移发现如下错误
于是,老老实实进web.config修改配置
发现修改后,还是这样的问题,有些苦恼了,仔细追踪,发现下面有提示是Nhibernate OpenSession时出错,看来问题出在这上面
Unhandled Exception: System.ArgumentNullException: Argument cannot be null.
Parameter name: type
at System.Activator.CheckType (System.Type type) [0x00000]
at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00000]
at NHibernate.AdoNet.SqlClientSqlCommandSet..ctor () [0x00000]
at NHibernate.AdoNet.SqlClientBatchingBatcher..ctor (NHibernate.AdoNet.ConnectionManager connectionManager, IInterceptor interceptor) [0x00000]
这时候试了很多方法,包括重写了一些nhibernate的调用方法,爬了很多文,一直没有找到解决方案,直到最后从某个角落找到了一个解释,抛出该错误的原因还有解释出来,只是翻译看得太累...
发生该错误的原因原来是:
NHibernate.AdoNet.SqlClientSqlCommandSet
[Test]
public void Test()
{
Assembly sysData = Assembly.Load("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
var sqlCmdSetType = sysData.GetType("System.Data.SqlClient.SqlCommandSet");
Assert.IsTrue(sqlCmdSetType != null, "Could not find SqlCommandSet!");
}
用以上测试,找不到SqlCommandSet....
似乎是由于平台的原因造成
目前解决办法
nhibernate:
配置
FluentNhibernate:
return Fluently.Configure()
.Database(
FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
.ConnectionString(s => s.Server("YourServer").Database("YourDB").Username("username").Password("userpwd")).AdoNetBatchSize(0))
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf()
).BuildSessionFactory();
即添加.AdoNetBatchSize(0)
至此问题解决,以上以作记录,也希望能帮遇到同样问题的人少走一些弯路!
参考URL:
https://github.com/codesharp/infrastructure/issues/15
http://sta-blockhead.blogspot.com/2009/06/systemdatasqlclientsqlcommandset.html