如何使用实体框架为具有静态数据的数据库设定种子

本文关键字:数据 数据库 种子 静态 实体 何使用 框架 | 更新日期: 2023-09-27 18:33:42

如何在实体框架中创建(种子(大量静态数据?静态数据是指位于数据库中但仅存在一次的数据。

例如,在我的数据库中,我有一个 CountrySet,其中包含全球所有国家。我希望这些国家永远在那里,但事实是,每次我清除数据库并重新创建它以进行新部署时,所有这些数据都会丢失。

在我的应用程序启动时(如果尚未创建(创建所有内容似乎对时间非常敏感。

我能在这里做什么?

如何使用实体框架为具有静态数据的数据库设定种子

首先,让我问这个问题:

您是否熟悉设置自己的Initializer时可以访问的Seed功能?

例:

在你的主函数中写这样的东西:

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和实体框架-4.3.1。如果不是这种情况,请重新标记/指定。

祝你有美好的一天:)

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

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

其中"我的初始值设定项"是一个继承IDatabaseInitializer<MyContext>接口的类。此接口具有InitializeDatabase(TContext context)方法,每当(重新(创建数据库时都会调用此方法。

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