我有一个EF代码第一个项目,我有如何种子数据库
internal sealed class Configuration : DbMigrationsConfiguration<myDB>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
ContextKey = "myDB.Auth.Service.DAL.myDB";
}
protected override void Seed(myDBdb)
{
var mProduct = new Product
{
Name = "default product",
CreatedDate = DateTime.Now
};
db.Products.AddOrUpdate(mProduct);
db.SaveChanges();
}
}
我有一个使用上面代码的wcf服务。我意识到每次重新启动wcf服务时(无论是从visual studio还是IIS),都会调用上面的代码。结果,多个&#34;默认产品&#34;被添加到数据库中,任何人都知道为什么会发生这种情况?
答案 0 :(得分:1)
第一步是使用Tools菜单,选择Library Package Manager,然后选择Package Manager Console。在Package Manager Console窗口中,键入以下命令。
Enable-Migrations
将在项目中添加名为Migrations的文件夹,以及名为Configuration.cs的代码文件。
在Configuration.cs中键入以下行
使用yourprojectname.Models;
protected override void Seed(yourprojectname.Models.MyServiceContext context)
{
context.MyDB.AddOrUpdate(x => x.Id,
new MyData() { Name = "Mohit", CreatedDate= "14/05/2016" },
new MyData() { Name = "Prabhat", CreatedDate= "15/05/2016" },
);
}
现在输入Update-Database
在包管理器控制台窗口中
答案 1 :(得分:0)
尝试以下方法:
protected override void Seed(myDBdb)
{
var mProduct = new Product
{
Id = 1,
Name = "default product",
CreatedDate = DateTime.Now
};
db.Products.AddOrUpdate(mProduct);
db.SaveChanges();
}
答案 2 :(得分:0)
首次使用应用程序初始化数据时,请使用ThreadLocal
。例如:
DropCreateDatabaseAlways
答案 3 :(得分:0)
迁移种子在每个更新数据库之后运行,因此您需要通过测试存在或使用AddOrUpdate使您的脚本具有幂等性。如果您只想在数据库创建上播种,则会有一个单独的上下文种子方法,该方法仅在创建数据库时运行。
https://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/
编辑:
使用MigrateDatabaseToLatestVersion初始化程序时,每次运行应用程序时都会运行种子方法。如果要控制此过程,请将初始化程序切换为null:
Database.SetInitializer(new NullDatabaseInitializer<ApplicationDbContext>());
然后只需在需要时手动运行迁移。为了更进一步,您可以编写自己的初始化程序,并在数据库不存在或数据库需要更新时执行您想要的操作:
Database.SetInitializer(new ValidateDbInitializer<ApplicationDbContext>());
// ref: https://coding.abel.nu/2012/03/prevent-ef-migrations-from-creating-or-changing-the-database/
public class ValidateDbInitializer<TContext> : IDatabaseInitializer<TContext>
where TContext : ApplicationDbContext
{
public void InitializeDatabase(TContext context)
{
if (!context.Database.Exists())
{
throw new InvalidOperationException("The database does not exist. Check your server and connection string.");
}
if (!context.Database.CompatibleWithModel(true))
{
throw new InvalidOperationException("The database is not up to date. You may need to apply update(s).");
}
}
}