C#实体框架未初始化数据库

本文关键字:初始化 数据库 框架 实体 | 更新日期: 2023-09-27 18:24:48

我正在尝试首先使用EF代码构建一个基于WPF数据库的应用程序。我有一个未生成数据库的问题,我试图这样解决:

using (var db = new MyDBContext())
{
    db.Database.Initialize(true);
}

我已经在App.xamls.cs中插入了这段代码,覆盖了OnStartup方法(这很有效)。

然后我尝试播种一些默认数据,比如:

public class MyDBContextSeeder : DropCreateDatabaseAlways<MyDBContext>
{
    protected override void Seed(MyDBContext context)
    {
        IList<Dog> defaultDog = new List<Dog>();
        defaultDog.Add(new Dog("Spike"));
        foreach (Dog d in defaultDog)
            context.Dogs.Add(d);
        // more data here....
        base.Seed(context);
    }
}

而且,由于我使用的是自定义初始化器,我修改了上面的第一个代码,如下所示:

using (var db = new PizzeriaDBContext())
{
    new MyDBContextSeeder().InitializeDatabase(db);    //this line
    db.Database.Initialize(true);
}

现在的问题是:

  • 当我构建应用程序时,我的默认数据不会被插入。我真的很确定。

  • 如果我试图再次构建我的应用程序,我会遇到一个异常,比如:

    Dog实体已在数据库中。

迁移已启用。

我已经尝试删除db.Database.Initialize(true),但当我这样做时,我的数据库甚至还没有创建。

C#实体框架未初始化数据库

默认情况下,数据库使用CreateDatabaseIfNotExits初始化程序。这就是为什么你会得到你的例外。所以我认为你需要做的是:

在您的overriden OnStartup上,您可以使用

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext,Configuration>)

为此,您需要将Configuration.cs类从内部密封更改为公共

作为参考,你可以看看这篇文章的最底部将数据库迁移到最新版本