我正在尝试使用 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/