努力理解nHibernate SchemaUpdate,即使是博客帖子
我看过关于nHibernate的努力理解nHibernate SchemaUpdate,即使是博客帖子,nhibernate,fluent-nhibernate,schema,Nhibernate,Fluent Nhibernate,Schema,我看过关于nHibernate的SchemaUpdate,甚至是Ayende的非常好的例子的各种博客文章,并下载了示例,但由于某种原因,我无法得到同样的东西来为我工作。我会注意到我使用的是Fluent NHibernate,但从我所能看出,这不会造成太大的差别 更新 我已经到了运行SchemaUpdate的地步,但它只是一个完整的模式创建,没有“修改”。换句话说,这就像我刚刚创建了一个新的数据库一样。我在下面发布我的完整来源 这是我基本上正在尝试的。。。我认为这通常是不言而喻的,但基本上我是使用
SchemaUpdate
,甚至是Ayende的
非常好的例子的各种博客文章,并下载了示例,但由于某种原因,我无法得到同样的东西来为我工作。我会注意到我使用的是Fluent NHibernate
,但从我所能看出,这不会造成太大的差别
更新
我已经到了运行SchemaUpdate
的地步,但它只是一个完整的模式创建,没有“修改”。换句话说,这就像我刚刚创建了一个新的数据库一样。我在下面发布我的完整来源
这是我基本上正在尝试的。。。我认为这通常是不言而喻的,但基本上我是使用Fluent配置创建一个配置
对象,然后尝试将其传递进来。单元测试通过,程序运行…但实际上什么都没有发生。我永远看不到任何结果,也看不到数据库模式得到更新
已创建数据库(缺少列等)
然后,在下一次运行时,将数据库映射到新架构
数据库(更新)应根据更新方法更新架构
但事实并非如此
我还看了其他关于这个问题的帖子。就像这里:
此外,在找到以下堆栈溢出帖子后,我更改了代码
即使使用了示例代码,也无法了解该特性的头绪
代码
private static void UpdateSchema(NHibernate.Cfg.Configuration配置){
System.Action updateExport=x=>{
使用(var file=new System.IO.FileStream(@“C:\Users\User\Documents\Visual Studio 2010\Mappings\update.sql”、System.IO.FileMode.Append、System.IO.FileAccess.Write))
使用(var sw=new System.IO.StreamWriter(文件)){
sw.Write(x);
sw.Close();
}
};
NHibernate.Tool.hbm2ddl.SchemaUpdate SchemaUpdater=新的NHibernate.Tool.hbm2ddl.SchemaUpdate(配置);
Execute(updateExport,false);
}
公共静态ISessionFactory映射(字符串连接字符串){
//熟练配置ms sql 2008数据库
返回FluentNHibernate.Cfg.fluent.Configure()
.数据库(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
.ConnectionString(c=>c.Is(ConnectionString))
.ADONbatchSize(50)
.FormatSql()
.UseReflectionOptimizer())
.Cache(c=>c
.ProviderClass()
.UseQueryCache()
.UseSecondLevelCache()文件
.useMiminamputs())
.Mappings(m=>{
m、 FluentMappings.Conventions.Setup(x=>{
x、 AddFromAssemblyOf();
x、 添加();
x、 添加(FluentNHibernate.Conventions.Helpers.AutoImport.Never());
});
m、 FluentMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutionGassembly());
})
.ExposeConfiguration(UpdateSchema)
.BuildSessionFactory();
}
您的示例对我很有用(NH3.1,FNH2.1)。SchemaUpdater检查当前数据库模式并创建正确的alter脚本。所有生成的脚本片段都将公开给UpdateSchema。没问题。我唯一感到困惑的一个细节是文件模式访问:
SchemaUpdater.Execute(updateExport,false)代码>
我不知道这是否是你的情况,但我现在很高兴——你的代码片段解决了我的一些问题。感谢您的启发:)。Ceil,我没有尝试使用Fluent NHibernate更新SchemaUpdate,但是使用映射文件,.hbm文件作为资源嵌入到DataLayer.dll中。更新会将当前架构与预期架构进行比较,并添加缺少的任何内容。您是否愿意尝试任何其他方法来升级架构,还是希望坚持使用SchemaUpdate?我愿意尝试其他方法。如果没有“DataLayer.dll”,该怎么办?AddAssembly调用只需要引用映射嵌入的位置。它可能是当前正在执行的assembly.Ok。我的问题是我没有第二次运行它。显然,您不能在第一次运行时进行架构更新,必须在第二次运行时进行。
private static void UpdateSchema(NHibernate.Cfg.Configuration Config) {
System.Action<string> updateExport = x => {
using (var file = new System.IO.FileStream(@"C:\Users\User\Documents\Visual Studio 2010\Mappings\update.sql", System.IO.FileMode.Append, System.IO.FileAccess.Write))
using (var sw = new System.IO.StreamWriter(file)) {
sw.Write(x);
sw.Close();
}
};
NHibernate.Tool.hbm2ddl.SchemaUpdate SchemaUpdater = new NHibernate.Tool.hbm2ddl.SchemaUpdate(Config);
SchemaUpdater.Execute(updateExport, false);
}
public static ISessionFactory Map(string connectionString) {
// fluently configure an ms-sql 2008 database
return FluentNHibernate.Cfg.Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.Is(connectionString))
.AdoNetBatchSize(50)
.FormatSql()
.UseReflectionOptimizer())
.Cache(c => c
.ProviderClass<NHibernate.Caches.SysCache2.SysCacheProvider>()
.UseQueryCache()
.UseSecondLevelCache()
.UseMinimalPuts())
.Mappings(m => {
m.FluentMappings.Conventions.Setup(x => {
x.AddFromAssemblyOf<Mappings.AspectMap>();
x.Add<EnumConvention>();
x.Add(FluentNHibernate.Conventions.Helpers.AutoImport.Never());
});
m.FluentMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
})
.ExposeConfiguration(UpdateSchema)
.BuildSessionFactory();
}
SchemaUpdater.Execute(updateExport, true);