在运行时在 ServiceStack.OrmLite 中获取类的表名/避免硬编码表名

Posted

技术标签:

【中文标题】在运行时在 ServiceStack.OrmLite 中获取类的表名/避免硬编码表名【英文标题】:Get table name of class at runtime in ServiceStack.OrmLite / avoid hardcoding table names 【发布时间】:2013-02-08 21:09:16 【问题描述】:

我使用ServiceStack.OrmLite 并希望从表中获取总行数。我目前按照ServiceStack.OrmLite documentation via

中指出的那样做
db.Scalar<int>("SELECT COUNT(*) FROM User");

但是,表的名称User 将来可能会更改,因此我正在寻找一种不对其进行硬编码的方法。是否可以从相应的类中获取表的名称,例如

string table_name = db.GetTableName<User> ();
db.Scalar<int>("SELECT COUNT(*) FROM 0", table_name);

?

【问题讨论】:

我不知道如何动态获取表名,但是在您的特定情况下,您不必为 count(*) 操作手动编写 SQL。你可以做类似 dbConnection.GetScalar(e => Sql.Count(e.Id)); 【参考方案1】:

访问类型的配置元数据的两种方法是:

ModelDefinition<User>.Definition.ModelName;
typeof(User).GetModelMetadata().ModelName;

虽然在某些数据库中您需要引用表名,但您可以这样做:

var modelDef = ModelDefinition<User>.Definition;
OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef)

所以是的,您可以将其包装在一个扩展方法中,以执行您想要的操作:

public static MyOrmLiteExtensions 
    public static string GetTableName<T>(this IDbConnection db) 
        var modelDef = ModelDefinition<T>.Definition;
        return OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef);
    

【讨论】:

这个扩展方法现在是 ServiceStack 的一部分,但它被称为 GetQuotedTableName,如果你想要可以在自定义查询中安全使用的表的名称 有没有等价的获取列名的方法? @Guerrilla Checkout IDbConnection.GetTableColumns() @mythz 你如何将类上的属性名与返回的列名联系起来? @Guerrilla 不知道您指的是什么 10 级深度,但 OrmLite 的整个源代码可在 github.com/ServiceStack/ServiceStack.OrmLite 获得。注意 OrmLite 是一个代码优先的 ORM,它不会告诉你列名是什么,你告诉它。 OrmLite 假设列名与属性名相同(使用配置的命名约定),当列名不同时,您必须使用 [Alias] 属性指定,Name 和 Alias 都在 FieldDefinition 上。将来请在新的明确定义的问题中提出新问题,即不要劫持 cmets

以上是关于在运行时在 ServiceStack.OrmLite 中获取类的表名/避免硬编码表名的主要内容,如果未能解决你的问题,请参考以下文章

MFC在运行时在优化校准中显示图像[重复]

如何仅在代码第一次运行时在 python 中运行函数?

如何在运行时在 Hibernate 中创建数据库?

反应:呈现组件时在浏览器中获取运行时错误/警告

如何在python中运行其他代码时在后台运行循环

仅在“构建并运行”时在 Xcode 中运行 bash 脚本