orm - 通过 Servicestack 中的 OrmLite 预填充表的最佳实践

标签 orm ormlite-servicestack

我正在通过 OrmLite 生成表,我想知道预填充表的最佳实践。示例表 - 国家、州、城市等。

我可以想到几种预填充表格的方法:

  1. 列出项目
  2. 种子数据库
  3. API(如果可能)
  4. 静态文件
  5. 在代码中
  6. 单独的项目

但是,在某些情况下,数据可能会变得很大,例如世界各地城市的示例,因此在代码中不可行。

我还可以考虑生成需要通过另一个项目直接预填充的表,在该项目中我可以从源获取数据并将其放入数据库中。

但是,我想知道当您通过 ORM 生成它时的场景(尤其是在生产中)。你会如何解决这个问题?

这一定是所有 ORM 的常见问题。

最佳答案

如果它只是像国家、州等的代码表,它们足够小,仍然可以将它们作为项目的一部分,通常我会创建一个名为的单独的静态类SeedData 包含 POCO 中的所有数据

1。维护宿主项目中的代码表

public static class SeedData
{
    public static List<Country> Countries
    {
        get { return new[] { new Country(...), ... }; }
    }
}

然后在您的 AppHost populate 中添加一个标志,决定是否在启动时重新创建它们,例如:

public void Configure(Container container)
{
    var appSettings = new AppSettings(); //Read from Web.config <appSettings/>
    if (appSettings.Get("RecreateTables", false))
    {
        using (var db = container.Resolve<IDbConnectionFactory>().Open())
        {
            db.DropAndCreateTable<Country>();
            db.InsertAll(SeedData.Countries);
            ...
        }
    }
}

更改 AppSetting 以重新创建表

当您将 RecreateTables appSetting 更改为 True 时,您可以重新创建表格并重新填充数据,例如:

<appSettings>
  <add key="RecreateTables" value="True" />
</appSettings>

由于 ASP.NET 的默认行为会自动重新启动 AppDomain,因此只需保存对 Web.config 的更改就足以在下次刷新任何页面时重新启动 ASP.NET 应用程序。

2。添加到临时显式测试中的测试项目

如果数据太大而无法适应工作项目,我首先会将其移动到 [Explicit] 文本固定装置内的单独测试项目(因此它永远不会自动运行),您可以轻松运行manuallu,例如:

[Explicit]
[TestFixture]
public class AdminTasks
{
    [Test]
    public void Recreate_and_populate_tables()
    {
        var dbFactory = new OrmLiteConnectionFactory(...);
        using (var db = dbFactory.Open())
        {
            db.DropAndCreateTable<Country>();
            db.InsertAll(SeedData.Countries);
            ...
        }
    }
} 

3。将数据保存在外部静态文本文件中

最后,如果数据太大而无法放入 C# 类中,我会将其保存到测试中的静态文件中,您可以轻松地将其重新水合到可以用 OrmLite 填充的 POCO 中,例如:

[Test]
public void Recreate_and_populate_tables()
{
    var dbFactory = new OrmLiteConnectionFactory(...);
    using (var db = dbFactory.Open())
    {
        db.DropAndCreateTable<Country>();
        var countries = File.ReadAllText("~/countries.txt".MapAbsolutePath())
            .FromJson<List<Country>>();
        db.InsertAll(countries);
        ...
    }
}

关于orm - 通过 Servicestack 中的 OrmLite 预填充表的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25554712/

相关文章:

java - 删除 Hibernate 生成的延迟初始化代理的最安全方法是什么?

java - hibernate 和 jackson (java.lang.IllegalStateException : Cannot call sendError() after the response has been committed)

mysql - 如何在ServiceStack OrmLite中随机排序?

c# - ORMLite 下的 SQLite 不允许在事务完成后执行任何操作

entity-framework - 在 Entity Framework 中映射值类型集合

java - Hibernate 1 :M relationship , 行顺序、常量值表和并发

Java对子类的静态反射

c# - 带有嵌套选择查询的 OrmLite

sqlite - 使用 SqliteDialect.Provider 的具有架构的表

servicestack - OrmLite 动态数据库模式