我正在通过 OrmLite 生成表,我想知道预填充表的最佳实践。示例表 - 国家、州、城市等。
我可以想到几种预填充表格的方法:
- 列出项目
- 种子数据库
- API(如果可能)
- 静态文件
- 在代码中
- 单独的项目
但是,在某些情况下,数据可能会变得很大,例如世界各地城市的示例,因此在代码中不可行。
我还可以考虑生成需要通过另一个项目直接预填充的表,在该项目中我可以从源获取数据并将其放入数据库中。
但是,我想知道当您通过 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/