努力理解nHibernate SchemaUpdate,即使是博客帖子

努力理解nHibernate SchemaUpdate,即使是博客帖子,nhibernate,fluent-nhibernate,schema,Nhibernate,Fluent Nhibernate,Schema,我看过关于nHibernate的SchemaUpdate,甚至是Ayende的非常好的例子的各种博客文章,并下载了示例,但由于某种原因,我无法得到同样的东西来为我工作。我会注意到我使用的是Fluent NHibernate,但从我所能看出,这不会造成太大的差别 更新 我已经到了运行SchemaUpdate的地步,但它只是一个完整的模式创建,没有“修改”。换句话说,这就像我刚刚创建了一个新的数据库一样。我在下面发布我的完整来源 这是我基本上正在尝试的。。。我认为这通常是不言而喻的,但基本上我是使用

我看过关于nHibernate的
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。没问题。我唯一感到困惑的一个细节是文件模式访问:

  • 第一次运行映射:整个数据库架构脚本 存储在update.sql文件中。请注意,由于doUpdate参数为false,脚本尚未执行:
    SchemaUpdater.Execute(updateExport,false)
  • 手动执行update.sql文件-已创建数据库架构
  • FNH映射的更改(例如,添加了属性)
  • 第二次映射运行:Corretct alter table脚本被添加到update.sql文件中
  • 也许最好在模式更新之前删除输出文件

    生成的脚本可以自动执行(doUpdate参数为true):


    我不知道这是否是你的情况,但我现在很高兴——你的代码片段解决了我的一些问题。感谢您的启发:)。

    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);