【问题标题】:Get table name of class at runtime in ServiceStack.OrmLite / avoid hardcoding table names在运行时在 ServiceStack.OrmLite 中获取类的表名/避免硬编码表名
【发布时间】: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));

标签: c# .net orm servicestack ormlite-servicestack


【解决方案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
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 2018-11-19
  • 2018-10-29
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多