【问题标题】:OrmLite dynamic database schemaOrmLite 动态数据库模式
【发布时间】:2014-06-17 12:21:27
【问题描述】:

是否可以在运行时使用 OrmLite 定义动态模式。例如,当通过 OrmLite 读取对象时,可以定义从哪个模式读取它。

这最好通过一个例子来说明。假设我在 MSSQL 2008 R2 数据库中有 3 个用户表:

Schema1.user Schema2.User Schema3.用户

我有一个定义了一些属性的对象用户。我选择像这样的数据“db.Select();”。问题是我没有定义从哪个模式读取用户数据。我希望能够在运行时执行此操作,但我似乎找不到合适的方法来执行此操作。

使用 C#、.NET 4.5 fw、MSSQL 2008 R2 数据库

谢谢!

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    您可以通过修改 OrmLite 为每种类型维护的元数据来做到这一点,即:

    var modelDef = SqlServerOrmLiteDialectProvider.GetModelDefinition(typeof(Poco));
    var existingSchema = modelDef.Schema;
    modelDef.Schema = "Schema2";
    
    // All queries on Poco now use `Schema2`
    
    modelDef.Schema = existingSchema; //Retain existing behavior
    

    【讨论】:

    • 如果这必须与多线程一起使用怎么办?例如,一个用户必须使用 Schema1,其他用户必须使用 Schema2。最好的方法(如我所见)是,如果您可以在调用扩展方法(例如 Select)时指定架构。
    • @DeBigBos 它正在改变一个单例实例,因此它确实会影响其他线程。创建重载并不是一个成功的策略,因为它会破坏和复杂化每个引入选项的 API 表面。最好使用作用域配置来覆盖默认配置。
    【解决方案2】:

    此功能在当前版本中变得更加容易。您可以在类上进行数据注释以设置如here 所解释的那样。

    示例:

    [Schema("test")]
    public class Foo 
    {
    }
    

    【讨论】:

    • OP 要求一种在运行时设置动态模式的方法。您的解决方案仅适用于编译时已知的单个模式。或者它需要创建具有不同 Schema 注释的类的 n 个副本。
    猜你喜欢
    • 2014-02-02
    • 2010-09-09
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多