使用此代码使用Nhibernate为SQL Server CE创建架构时:
Fluently.Configure()
.Database(MsSqlCeConfiguration.Standard
.ConnectionString(c => c.Is("Data Source=" + file))
.Dialect<NHibernate.Dialect.MsSqlCeDialect>()
.Driver<NHibernate.Driver.SqlServerCeDriver>()
.ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<NHibernateSessionFactory>())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
private static void BuildSchema(Configuration config)
{
// new SchemaExport(config).Drop(false, true);
//new SchemaExport(config).Create(true, true);
//If DB File does not exists, create it.
if (!File.Exists(file))
{
Directory.CreateDirectory(Path.GetDirectoryName(databaseFileName));
SqlCeEngine engine = new SqlCeEngine("Data Source="+ file);
engine.CreateDatabase();
// this NHibernate tool takes a configuration (with mapping info in)
// and exports a database schema from it
new SchemaExport(config).Execute(false, true, false);
//FormulasDAO.AddDefaultFormulaCollection();
}
else
{
new SchemaUpdate(config).Execute(false, true);
}
}
我有这样的例外
创建SessionFactory时使用了无效或不完整的配置。检查PotentialReasons集合,以及InnerException以获取更多详细信息。
内部异常是
程序集中的IDbCommand和IDbConnection实现 找不到System.Data.SqlServerCe。确保 程序集System.Data.SqlServerCe位于应用程序中 目录或全局程序集缓存中。如果组件在 GAC,在应用程序中使用元素 配置文件,用于指定程序集的全名。
帮助解决此问题。
答案 0 :(得分:7)
实际上问题是,在GAC中有2个版本的dll所以Nhibernate不知道哪个dll需要使用,因为NHibernate使用dll名称从gAC获取dll而不使用版本名称。
所以需要在AppConfig中告诉NHibernate
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="System.Data.SqlServerCe" fullName="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</assemblyBinding>