注入TableName作为更新的参数&在ServiceStack Ormlite中的GenericEntity上插入

时间:2014-07-25 12:16:57

标签: ormlite-servicestack

我有3个相同结构的表,所以我使用ServiceStack创建了以下实体

public class GenericEntity
{
    [Alias("COL_A")]
    public string ColumnA { get; set; }
}

为了重新检索结果,我使用以下代码行。在其中我传递表名称如“TableA”/“TableB”,以便我可以得到适当的结果

db.Select<GenericEntity>(w => w.Where(whereExperssion).OrderBy(o => o.ColumnA).From("TableA"));

对于删除,我使用以下代码

 db.Delete<GenericEntity>(w => w.Where(q => q.ColumnA == "A").From("TableA"));

使用From()我可以传递SELECT&amp;的表名。删除操作。插入和更新有类似的方法吗?以下是我用于更新和插入

的代码段

插入

db.Insert(new GenericEntity() {});

更新

db.Update<GenericEntity>(new GenericEntity { ColumnA = "ModifiedData"},p => p.ColumnA == "OriginalData");

1 个答案:

答案 0 :(得分:2)

正如您对多个API的想法一样,我added a test展示如何通过使用您自己的自定义扩展方法扩展OrmLite的API来实现所需的行为,该方法在运行时修改OrmLite的表元数据以添加新的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();

使用这些扩展方法:

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扩展OrmLite,因为OrmLite本身只是ADO.NET IDbConnection上的一组扩展方法。