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)
,但当我这样做时,我的数据库甚至还没有创建。
默认情况下,数据库使用CreateDatabaseIfNotExits初始化程序。这就是为什么你会得到你的例外。所以我认为你需要做的是:
在您的overriden OnStartup上,您可以使用
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext,Configuration>)
为此,您需要将Configuration.cs类从内部密封更改为公共
作为参考,你可以看看这篇文章的最底部将数据库迁移到最新版本