在运行时在 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访问类型的配置元数据的两种方法是:
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 中获取类的表名/避免硬编码表名的主要内容,如果未能解决你的问题,请参考以下文章