TMc*_*TMc 8 servicestack ormlite-servicestack
OrmLite能否识别我的POCO和我的架构之间的差异,并根据需要自动添加(或删除)列以强制架构与我的POCO保持同步?
如果此功能不存在,我是否有办法查询数据库的表模式,以便我可以手动执行同步?我找到了这个,但是我使用的是安装了ServiceStack的OrmLite版本,但就我而言,我找不到具有TableInfo类的命名空间.
Sco*_*ing 11
我创建了一个扩展方法来自动将缺少的列添加到我的表中.到目前为止工作得很好.警告:获取列名的代码是特定于SQL Server的.
namespace System.Data
{
public static class IDbConnectionExtensions
{
private static List<string> GetColumnNames(IDbConnection db, string tableName)
{
var columns = new List<string>();
using (var cmd = db.CreateCommand())
{
cmd.CommandText = "exec sp_columns " + tableName;
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var ordinal = reader.GetOrdinal("COLUMN_NAME");
columns.Add(reader.GetString(ordinal));
}
reader.Close();
}
return columns;
}
public static void AlterTable<T>(this IDbConnection db) where T : new()
{
var model = ModelDefinition<T>.Definition;
// just create the table if it doesn't already exist
if (db.TableExists(model.ModelName) == false)
{
db.CreateTable<T>(overwrite: false);
return;
}
// find each of the missing fields
var columns = GetColumnNames(db, model.ModelName);
var missing = ModelDefinition<T>.Definition.FieldDefinitions
.Where(field => columns.Contains(field.FieldName) == false)
.ToList();
// add a new column for each missing field
foreach (var field in missing)
{
var alterSql = string.Format("ALTER TABLE {0} ADD {1} {2}",
model.ModelName,
field.FieldName,
db.GetDialectProvider().GetColumnTypeDefinition(field.FieldType)
);
Console.WriteLine(alterSql);
db.ExecuteSql(alterSql);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
否,目前ServiceStack 的 OrmLite中不支持 RDBMS Schema 与 POCO 的自动迁移。
目前OrmLite 的问题中正在讨论一些线程,这些线程正在探索添加此功能的不同方法。
归档时间: |
|
查看次数: |
7800 次 |
最近记录: |