繁体   English   中英

如何使用Entity Framework为静态数据建立数据库?

[英]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
        }
    }

这只是我躺在一个项目中的一些模板代码。

如果您确实每次都在重新创建数据库,那么我不知道在没有“手动”添加所有数据的情况下“种子”数据库的任何其他方法。

在另一方面,如果你打算做的比你想改变它的详细信息,每次删除数据库以外的东西,你可能需要手动编写清除按照某种逻辑所有新数据的功能。

我希望这回答了你的问题 :)

另外:您既没有在问题中指定,也没有使用您正在谈论的技术标签。 我认为它是 如果不是这样,请重新标记/指定。

祝你今天愉快 :)

您可以为上下文设置初始值设定项,例如:

System.Data.Entity.Database.SetInitializer<MyContext>(new MyInitializer());

其中'MyInitializer'是继承IDatabaseInitializer<MyContext>接口的类。 此接口有一个方法InitializeDatabase(TContext context) ,只要(重新)创建数据库,就会调用此方法。

在此方法中,您可以使用任何您想要填充数据库的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM