C# 实体框架不是种子数据

C# 实体框架不是种子数据,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我先用EF代码构建一个WPF应用程序 我的数据库已创建,但当我在初始化时尝试在其中播种数据时,它失败(未插入任何数据) 这是我的初始值设定项: public class MyDBContextSeeder : DropCreateDatabaseIfModelChanges<MyDBContext> { protected override void Seed(MyDBContext context) { IList<Dog> defaul

我先用EF代码构建一个WPF应用程序

我的数据库已创建,但当我在初始化时尝试在其中播种数据时,它失败(未插入任何数据)

这是我的初始值设定项:

public class MyDBContextSeeder : DropCreateDatabaseIfModelChanges<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);
    }
}
然后我在
App.xamls.cs
中插入了这段代码,覆盖了OnStartup方法

using (var db = new MyDBContext())
{
  Database.SetInitializer<MyDBContext>(new CreateDatabaseIfNotExists<MyDBContext>());
  new MyDBContextSeeder().InitializeDatabase(db); 
}
使用(var db=new MyDBContext())
{
SetInitializer(新的CreateDatabaseIfNotExists());
新建MyDBContextSeeder()。初始化数据库(db);
}
如果我不使用新的MyDBContextSeeder().InitializeDatabase(db)则不会创建我的数据库

顺便说一下,我真的不明白为什么我的数据库里没有任何数据。
已启用迁移。我遗漏了什么吗?

您正确地将您的狗插入了
DbContext
中,但您没有保存更改。请在
.Seed()
方法的末尾添加对
context.SaveChanges()
的调用,您的狗应该出现在数据库中。汪汪汪

试试这个

public class MyDBContextSeeder : DropCreateDatabaseIfModelChanges<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);

            context.SaveChanges();
        }
    }
公共类MyDBContextSeeder:DropCreateDatabaseIfModelChanges { 受保护的覆盖无效种子(MyDBContext上下文) { IList defaultDog=新列表(); defaultDog.Add(新狗(“Spike”); foreach(默认狗中的狗d) 上下文。狗。添加(d); SaveChanges(); } } --

公共类MyDBContext:DbContext
{
静态MyDBContext()
{
SetInitializer(新的MyDBContextSeeder());
}
}

您是否尝试更改模型或删除数据库对象以触发ContextSeeder?请记住,它只会
DropCreateDatabaseIfModelChanges
@ThiagoLunardi我是初学者..什么意思?我的意思是,如果模型(实体)发生变化,EF只会调用
MyDBContextSeeder.Seed()
方法。尝试删除数据库上下文中的部分或全部表,或在Dog类中添加新属性,并在
MyDBContextSeeder.Seed()
方法中设置断点以继续操作。@ThiagoLunardi我现在明白你的意思,但即使我更改为
DropCreateDatabaseAlways
它也不会播种任何数据。你是否缺少保存更改()在Seed()方法的末尾?我必须在哪里调用它?在DbContext或DbContextSeeder内?我仍然没有数据库内的任何数据
.Seed
方法仅在数据库初始化时运行。初始化在创建数据库时发生。您可以通过调用
context.database.Initialize(false)强制执行
。尝试使用此方法,而不是您正在使用的方法。仍然需要使用
上下文.SaveChanges()
。通过手动删除数据库或更改模型定义(临时添加虚拟列)强制初始化.BTW,在DbContext构造函数中设置初始值设定项就足够了。您不需要在其他任何地方执行此操作。OTOH,如果您不强制DB初始化,它将在您第一次实例和使用DbContext时发生。数据库中仍然没有数据
public class MyDBContextSeeder : DropCreateDatabaseIfModelChanges<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);

            context.SaveChanges();
        }
    }
public class MyDBContext : DbContext
{
    static MyDBContext()
    {
        Database.SetInitializer<MyDBContext>(new MyDBContextSeeder());
    }
}