[英]How do I properly seed data with a circular dependency in Entity Framework Core?
[英]How do I seed a database with static data using Entity Framework?
如何在Entity Framework中创建(种子)大量静态数据? 静态数据我指的是位于数据库中的数据,但只存在一次。
例如,在我的数据库中,我有一个CountrySet,包含全球所有国家/地区。 我希望这些国家永远存在,但事实是每次我擦除我的数据库并重新创建它以进行新部署时,所有这些数据都会丢失。
在我的应用程序启动时创建它(如果它尚未创建)似乎对时间非常敏感。
我能在这做什么?
首先,让我问一下:
您是否熟悉在设置自己的Initializer
时可以访问的Seed
功能?
例:
在你的main函数中写这样的东西:
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)
,只要(重新)创建数据库,就会调用此方法。
在此方法中,您可以使用任何您想要填充数据库的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.