【发布时间】: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