【问题标题】:Struggling to Comprehend nHibernate SchemaUpdate, even with Blog Posts努力理解 nHibernate SchemaUpdate,即使是博客文章
【发布时间】:2013-02-16 16:34:56
【问题描述】:

我看过有关 nHibernate 的 SchemaUpdate 的各种博客文章,甚至是 Ayende's 非常好的示例,并下载了示例,但由于某种原因,我无法得到同样的东西来为我工作。我会注意到我使用的是Fluent NHibernate,但据我所知,这应该不会产生太大的影响。

更新

我已经到了SchemaUpdate 运行的地步,但这只是一个完整的模式创建,没有“改变”。换句话说,就好像我刚刚新建了数据库一样。我在下面发布了我的完整源代码。

这是我基本上正在尝试的...我认为这通常是不言而喻的,但基本上我正在使用 Fluent 配置创建一个Configuration 对象,然后尝试将其传入。单元测试通过,程序运行...但实际上什么也没发生。我永远看不到任何结果,也永远看不到数据库架构得到更新。

创建数据库(缺少列等)

数据库然后在下次运行时使用新架构进行映射。

数据库(更新)应根据更新方法更新架构。

但实际情况并非如此。

我还查看了有关此事的其他帖子。喜欢这里:http://morten.lyhr.dk/2008/03/nhibernates-schemaupdate-feature.html

此外,我在找到以下 Stack Overflow 帖子后更改了我的代码 Make Fluent NHibernate output schema update to file

而且即使使用示例代码也无法对这个功能做出正面或反面。

代码

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

【问题讨论】:

  • Ceil,我没有尝试使用 Fluent NHibernate 进行 SchemaUpdate,但使用映射文件时,.hbm 文件作为资源嵌入到您的 DataLayer.dll 中。更新将当前架构与预期架构进行比较,并添加任何缺失的内容。
  • 您愿意尝试任何其他方法来升级您的架构还是坚持使用 schemaupdate
  • 我愿意尝试不同的方法。
  • 如果没有“DataLayer.dll”怎么办?
  • AddAssembly 调用只需要引用映射的嵌入位置。它可能是当前正在执行的程序集。

标签: nhibernate fluent-nhibernate schema


【解决方案1】:

您的示例对我很有效(NH3.1,FNH 2.1)。 SchemaUpdater 检查当前数据库模式并创建正确的更改脚本。所有生成的脚本片段都暴露给 UpdateSchema。这里没问题。我唯一感到困惑的一个细节是文件模式访问:

  1. 第一次地图运行:整个数据库架构脚本是 存储在 update.sql 文件中。请注意,该脚本尚未执行,因为 doUpdate 参数为 false:SchemaUpdater.Execute(updateExport, false);
  2. 手动执行 update.sql 文件 - 创建数据库架构。
  3. FNH 映射发生变化(例如,添加了一个属性)。
  4. 第二次地图运行:更正的更改表脚本附加到 update.sql 文件中。

也许在架构更新之前删除输出文件会更好。

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

SchemaUpdater.Execute(updateExport, true);

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

【讨论】:

  • 好的。我的问题是我没有第二次运行它。显然你不能在第一次运行时进行架构更新,你必须在第二次运行。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2021-02-23
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多