如何在Entity Framework中创建(种子)大量静态数据?静态数据我指的是位于数据库中的数据,但只存在一次。
例如,在我的数据库中,我有一个CountrySet,包含全球所有国家/地区。我希望这些国家永远存在,但事实是,每次我擦除数据库并重新创建它以进行新部署时,所有数据都将丢失。
当我的应用程序启动时(如果它尚未创建)创建它似乎对时间非常敏感。
我可以在这做什么?
答案 0 :(得分:4)
首先,让我问一下:
您是否熟悉在设置自己的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
}
}
这只是我躺在一个项目中的一些模板代码。
如果您确实每次都在重新创建数据库,那么我不知道在没有“手动”添加所有数据的情况下“种子”数据库的任何其他方式。
另一方面,如果您计划在每次要更改其中的详细信息时执行删除数据库以外的操作,则可能必须手动写入根据某种逻辑清除所有新数据的功能。
我希望这能回答你的问题:)
ALSO:您既没有在问题中指定,也没有使用您正在谈论的技术标签。我认为它是c#,.net和entity-framework-4.3.1。如果不是这样,请重新标记/指定。
祝你有个美好的一天:)
答案 1 :(得分:1)
您可以为上下文设置初始值设定项,例如:
System.Data.Entity.Database.SetInitializer<MyContext>(new MyInitializer());
其中'MyInitializer'是继承IDatabaseInitializer<MyContext>
接口的类。此接口具有方法InitializeDatabase(TContext context)
,只要(重新)创建数据库,就会调用此方法。
在此方法中,您可以使用任何您想要填充数据库的方法。