使用OrmLite时,有没有办法在修改POCO时自动更新表模式?

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)


myt*_*thz 4

否,目前ServiceStack 的 OrmLite中不支持 RDBMS Schema 与 POCO 的自动迁移。

目前OrmLite 的问题中正在讨论一些线程,这些线程正在探索添加此功能的不同方法。

  • @mythz OrmLite 问题的链接已损坏。 (6认同)
  • 有自动迁移支持的更新吗? (2认同)