【发布时间】:2014-01-23 22:17:20
【问题描述】:
是否有首选方法来检测代码模型中的更改并自动重新创建数据库?我不需要迁移数据,如果有变化,我可以完全删除所有表,从模型中重新创建表,并使用代码中的初始数据集填充新表。
与此相关:有没有办法通过使用 ServiceStack 的 ORMLite 版本来获取数据库中所有表的列表?
目前我正在使用我自己的课程,但如果已经有一些东西,我不想发明轮子。
Web.config:
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=(local);Integrated Security=SSPI;database=MyTestDatabase"
providerName="System.Data.SqlClient" />
</connectionStrings>
数据库实用程序:
public class DatabaseUtil
{
private const int CURR_VERSION = 1;
private static string connString = WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
public static void Init(Funq.Container container)
{
using (var db = connString.OpenDbConnection())
{
using (IDbConnection dbConn = connString.OpenDbConnection())
{
var createScript = !db.TableExists(typeof(ZatabaseConfig).Name.ToString());
if (!createScript)
{
var first = dbConn.FirstOrDefault<ZatabaseConfig>("");
createScript = first == null || first.Version < CURR_VERSION;
}
if (createScript)
{
DropAndCreateDatabase(dbConn);
}
}
// db.InsertAll(SeedData);
}
}
private static void DropAndCreateDatabase(IDbConnection dbConn)
{
var tables = new[] { typeof(Table1), typeof(Table2), typeof(Table3), typeof(ZatabaseConfig) };
// running drop tables only once doesn't remove tables that are referenced
using (var dbDrop = createConnection())
dbDrop.ExecuteSql(DROP_EVERYTHING_CONSTRAINT);
for (int i = 0; i < 5; i++)
{
// dropping table 5 times to eliminate foreign constraints
try
{
using (var dbNew = createConnection())
dbNew.ExecuteSql(DROP_EVERYTHING_TABLES);
}
catch
{
}
}
//Drop and re-create all Auth and registration tables
//var authRepo = (OrmLiteAuthRepository)container.Resolve<IUserAuthRepository>();
//authRepo.DropAndReCreateTables();
dbConn.CreateTables(true, tables);
dbConn.Insert(new ZatabaseConfig { ConfigId = (int)ZatabaseConfigIds.Version, Name = CURR_VERSION });
}
private static string DROP_EVERYTHING_CONSTRAINT = @"
SELECT 'ALTER TABLE ' + OBJECT_NAME(f.parent_object_id)+
' DROP CONSTRAINT ' + f.name
FROM .sys.foreign_keys AS f
INNER JOIN .sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
";
private static string DROP_EVERYTHING_TABLES = @"
exec sp_MSforeachtable 'DROP TABLE ?'
";
}
【问题讨论】:
标签: servicestack ormlite-servicestack