C# 实体框架不是种子数据
我先用EF代码构建一个WPF应用程序 我的数据库已创建,但当我在初始化时尝试在其中播种数据时,它失败(未插入任何数据) 这是我的初始值设定项: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
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());
}
}