我通过OrmLite生成表格,我想知道预先填充表格的最佳做法。示例表 - 国家,州,城市等。
我可以考虑预先填充表格的几种方法:
但是,在某些情况下,数据可能会像世界各地的城市示例那样变大,因此代码不可行。
我还可以考虑生成需要通过另一个项目直接预先填充的表,我可以从源中获取数据并将其放入数据库中。
然而,当你通过ORM(特别是在制作中)生成它时,我想知道这种情况。你会如何解决这个问题?
这必须是所有ORM的常见问题。
答案 0 :(得分:2)
如果它只是像国家,州等那样的代码表,它们足够小,仍然可以将它们作为项目的一部分,通常我会创建一个名为{{1的单独的静态类与POCO的所有数据
SeedData
然后在你的AppHost populate中添加一个关于是否在启动时重新创建它们的标志,例如:
public static class SeedData
{
public static List<Country> Countries
{
get { return new[] { new Country(...), ... }; }
}
}
这样,当您将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
时,您可以重新创建表格并重新填充数据,例如:
True
由于ASP.NET的默认行为将自动重新启动AppDomain,因此只需将更改保存到<appSettings>
<add key="RecreateTables" value="True" />
</appSettings>
即可在下次刷新任何页面时重新启动ASP.NET应用程序。
如果数据太大而无法适应工作项目,我首先将其移动到Web.config
文本夹具内的单独测试项目(因此它永远不会自动运行),您可以轻松地运行manuallu,例如:
[Explicit]
最后,如果数据太大而不适合C#类,我会将其保存到测试中的静态文件中,您可以轻松地将其重新水合成可以用OrmLite填充的POCO,例如:
[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);
...
}
}
}