如何在实体框架中创建(种子)大量静态数据?静态数据是指位于数据库中但仅存在一次的数据。
例如,在我的数据库中,我有一个 CountrySet,其中包含全球所有国家/地区。我希望这些国家永远存在,但事实是,每次我清除我的数据库并重新创建它以进行新部署时,所有这些数据都会丢失。
在我的应用程序启动时创建所有内容(如果尚未创建)似乎对时间非常敏感。
我可以在这里做什么?
如何在实体框架中创建(种子)大量静态数据?静态数据是指位于数据库中但仅存在一次的数据。
例如,在我的数据库中,我有一个 CountrySet,其中包含全球所有国家/地区。我希望这些国家永远存在,但事实是,每次我清除我的数据库并重新创建它以进行新部署时,所有这些数据都会丢失。
在我的应用程序启动时创建所有内容(如果尚未创建)似乎对时间非常敏感。
我可以在这里做什么?
首先,让我问这个问题:
您是否熟悉Seed
自己设置时可以访问的功能Initializer
?
例子:
在你的主函数中写下这样的内容:
System.Data.Entity.Database.SetInitializer(new SystemContext.SystemInitializer());
SystemContext
你的DbContext
班级在哪里。
在该课程中,您应该具有以下内容:
public class SystemContext : DbContext
{
public DbSet<Stock> Stocks { get; set; }
public DbSet<RawDayValues> StockRawValues { get; set; }
public SystemContext()
: base("Server=localhost;Database=test;Trusted_Connection=True;")
{ }
public class SystemInitializer : DropCreateDatabaseIfModelChanges<SystemContext>
{
#region SEED
// This is what you're looking for!
protected override void Seed(SystemContext context)
{
try
{
var stock = new Stock() { Symbol = "TEST" };
context.Stocks.Add(stock);
context.SaveChanges();
}
catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
base.Seed(context);
}
#endregion
}
}
这只是我在一个项目中的一些模板代码。
如果您确实每次都在重新创建数据库,那么我不知道有任何其他方法可以在不“手动”添加所有数据的情况下“播种”数据库。
另一方面,如果您打算在每次想要更改其中的详细信息时都删除数据库之外的其他操作,则可能必须手动编写函数,根据某些逻辑清除所有新数据。
我希望这回答了你的问题 :)
还:您既没有在问题中指定,也没有使用标签指定您正在谈论的技术。我认为它是c#、.net和entity-framework-4.3.1。如果不是这种情况,请重新标记/指定。
祝你今天过得愉快 :)
您可以为上下文设置初始化程序,例如:
System.Data.Entity.Database.SetInitializer<MyContext>(new MyInitializer());
其中“MyInitializer”是一个继承IDatabaseInitializer<MyContext>
接口的类。这个接口有一个方法InitializeDatabase(TContext context)
,每当(重新)创建数据库时都会调用这个方法。
在此方法中,您可以使用任何您想要填充数据库的方式。