gpt4 book ai didi

nhibernate - 即使有博客文章,也很难理解 nHibernate SchemaUpdate

转载 作者:行者123 更新时间:2023-12-02 18:47:21 24 4
gpt4 key购买 nike

我看过有关 nHibernate 的 SchemaUpdate 的各种博客文章,甚至还有 Ayende 非常好的示例,并下载了示例,但由于某种原因我无法获得相同的示例同样的事情为我工作。我会注意到我正在使用 Fluent NHibernate,但据我所知,这不会产生太大的差异。

更新

I have reached the point where the SchemaUpdate runs, but it is just a full schema creation, no 'altering'. In otherwords, it's the same as if I just built the database fresh. I am posting my full source below.

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

Database gets created (missing columns, etc)

Database then gets mapped with new schema on next run.

Database (Update) should update the Schema per the Update method.

但这并不是实际发生的情况。

我还查看了有关此事的其他帖子。就像这里: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();
}

最佳答案

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

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

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

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

SchemaUpdater.Execute(updateExport, true);

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

关于nhibernate - 即使有博客文章,也很难理解 nHibernate SchemaUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6718025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com