是否有任何O / R映射器会在您更新业务对象时自动创建或修改数据库架构?在环顾四周之后,似乎大多数库通过从数据库模式创建业务对象而以另一种方式工作。
我希望拥有这种能力的原因是我正在计划一种产品,将其数据存储在客户机器上的数据库中。所以我可能必须在新版本发布时更新数据库架构。
另一个要求是映射器支持基于文件的数据库,如SQLite或JET,而不仅仅是SQL服务器。
我知道Developer Express的XPO具有这种能力,但我想知道是否有其他选择。
由于
答案 0 :(得分:2)
NHibernate可以为您生成业务对象的数据库架构。
答案 1 :(得分:1)
SubSonic做你需要的。它有一个与声音指挥官一起使用的迁移类。我修改了代码并将其放入我的应用程序的启动中,并让它检查版本差异并自动升级。 这就是你需要设置它的方法:
// *不确定为什么我需要这一行来使代码块在
下面工作namespace MyApps.Migrations
{
public class _001_Initial : Migration
{
public override void Up()
{
//Execute your upgrade query here
}
public override void Down()
{
//Execute your downgrade query here
}
}
}
//
using System;
using System.Collections.Generic;
using SubSonic;
using SubSonic.Migrations;
namespace MyApps.Migrations
{
internal static class MigrationHelper
{
const string NameSpace = "MyApps.Migrations";
private const string SCHEMA_INFO = "SubSonicSchemaInfo";
public static int CurrentVersion { get { return currentVersion; } }
public static int AppVersion { get { return latestVersion; } }
public static bool IsUpdateAvailable { get { return (updateVersion.Count > 0); } }
public static bool IsAppVersionOlder { get; private set; }
public static bool Checked { get; internal set; }
private static int currentVersion;
private static int latestVersion;
private static List<string> updateVersion;
private static List<string> availableVersion;
static MigrationHelper()
{
Checked = false;
}
/// <summary>
/// Migrates the specified migration directory.
/// </summary>
public static void CheckForMigration()
{
currentVersion = Migrator.GetCurrentVersion("YourProviderName");
Type[] allTypes =
System.Reflection.Assembly.GetExecutingAssembly().GetTypes();
availableVersion = new List<string>();
foreach (Type type in allTypes)
{
if (type.Namespace == NameSpace)
if (type.Name.Substring(0, 1) == "_")
availableVersion.Add(type.Name);
}
availableVersion.Sort();
updateVersion = new List<string>();
foreach (string s in availableVersion)
{
int version = 0;
if (int.TryParse(s.Substring(1,3), out version))
{
if (version > currentVersion)
{
updateVersion.Add(s);
}
latestVersion = version;
}
}
IsAppVersionOlder = (latestVersion < currentVersion);
//log.WriteLine(string.Format(
///"CheckForMigration: DbVer = {0}, AppVer = {1}, UpdateAvailable = {2}, IsAppOlder = {3}",
//currentVersion, latestVersion, updateVersion.Count, IsAppVersionOlder));
Checked = true;
}
internal static void Migrate()
{
foreach (string s in updateVersion)
{
Migration _migration = (Migration)Activator.CreateInstance(
System.Reflection.Assembly.GetExecutingAssembly().GetType(
"MyApps.Migrations." + s));
_migration.Migrate("YourProviderName", Migration.MigrationDirection.Up);
IncrementVersion();
}
}
private static void IncrementVersion()
{
new Update(SCHEMA_INFO,
"YourProviderName").SetExpression("version").EqualTo("version+1").Execute();
}
}
}
SubSonic将自动将一个名为SubSonicSchemaInfo的表添加到您的数据库,以帮助跟踪数据库版本。
这是一篇很长的帖子,希望我没有错过任何东西
答案 2 :(得分:0)
NHibernate可以更新架构还是删除它并重新创建它?