动态创建具有自定义名称的表,并使用自定义表名插入

时间:2015-03-26 03:57:46

标签: servicestack

我想用自定义名称创建表,但我找不到示例代码。我注意到创建表的唯一方法是通用类型,如db.CreateTable()。我是否知道是否有办法动态创建表名而不是使用Alias?原因是因为有时我们想将相同的对象类型存储到不同的表中,如2015_january_activity,2015_february_activity。

除此之外,db.Insert也非常局限于对象类型。无论如何通过传入表名来插入?

我认为这些功能非常重要,因为它在NoSQL解决方案中存在很长时间并且非常灵活。感谢。

1 个答案:

答案 0 :(得分:4)

OrmLite主要是代码优先的ORM,它使用类型化的POCO来创建和查询匹配的RDMBS表的模式。它还支持使用Custom SQL API's执行自定义SQL。

使用不同表名的一个选项是在运行时将Alias更改为seen in this previous answer,您可以在其中创建自定义扩展方法来修改表的名称,例如:

public static class GenericTableExtensions 
{
    static object ExecWithAlias<T>(string table, Func<object> fn)
    {
        var modelDef = typeof(T).GetModelMetadata();
        lock (modelDef) {
            var hold = modelDef.Alias;
            try {
                modelDef.Alias = table;
                return fn();
            }
            finally {
                modelDef.Alias = hold;
            }
        }
    }

    public static void DropAndCreateTable<T>(this IDbConnection db, string table) {
        ExecWithAlias<T>(table, () => { db.DropAndCreateTable<T>(); return null; });
    }

    public static long Insert<T>(this IDbConnection db, string table, T obj, bool selectIdentity = false) {
        return (long)ExecWithAlias<T>(table, () => db.Insert(obj, selectIdentity));
    }

    public static List<T> Select<T>(this IDbConnection db, string table, Func<SqlExpression<T>, SqlExpression<T>> expression) {
        return (List<T>)ExecWithAlias<T>(table, () => db.Select(expression));
    }

    public static int Update<T>(this IDbConnection db, string table, T item, Expression<Func<T, bool>> where) {
        return (int)ExecWithAlias<T>(table, () => db.Update(item, where));
    }
}

这些扩展方法提供了额外的API,允许您更改所用表的名称,例如:

var tableName = "TableA"'
db.DropAndCreateTable<GenericEntity>(tableName);

db.Insert(tableName, new GenericEntity { Id = 1, ColumnA = "A" });

var rows = db.Select<GenericEntity>(tableName, q =>
    q.Where(x => x.ColumnA == "A"));

rows.PrintDump();

db.Update(tableName, new GenericEntity { ColumnA = "B" },
    where: q => q.ColumnA == "A");

rows = db.Select<GenericEntity>(tableName, q => 
    q.Where(x => x.ColumnA == "B"));

rows.PrintDump();

此示例也可在GenericTableExpressions.cs集成测试中使用。