C# Entity Framework 未初始化数据库

标签 c# wpf entity-framework

我正在尝试使用 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 entity is already in database.

已启用迁移。

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

最佳答案

默认情况下,您的数据库使用 CreateDatabaseIfNotExits 初始化程序。这就是你得到异常(exception)的原因。所以我认为你需要做的是:

在您覆盖的 OnStartup 上,您可以使用

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

为此,您需要将 Configuration.cs 类从 internal sealed 更改为 Public

作为引用,您可以查看本文的最底部 MigrateDatabaseToLatestVersion

关于C# Entity Framework 未初始化数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33941839/

相关文章:

c# - DbSet<T>.Where(where).ToList() - 为什么 SQL 不包含 where 子句?

c# - 如何将用户/权限关系定义为 M :M?

c# - 基于深度 JSON 数据更新 EF 实体

c# - 如何以编程方式查找 WPF 扩展子项?

c# - 检查 Word 文档中的特定单词是否为粗体?

c# - 过滤文件名 : getting *. abc without *.abcd, or *.abcde, 等等

c# - 倒计时通知线程延迟的最佳实践

WPF Adorner剪辑

c# - 设置ImageBrush的图像偏移量?

c# - 如何在没有父类的情况下使用内联变量声明内联对象