我编写了模型和上下文类,成功运行了初始迁移,并在我的机器上播种并生成了本地数据库。问题是我正在大学使用Github进行协作项目,而.gitignore
文件忽略了.mdf
文件(原因很明显)。
我的问题:如果在.mdf
文件夹中不存在qzexswpoi SQL Server数据库文件,有没有办法在app启动时自动生成和播种?
我的上下文类看起来像这样:
App_Data
连接字符串如下:
public class ABFContext : DbContext
{
public ABFContext() : base("ABFDatabase")
{
Database.SetInitializer(new CreateDatabaseIfNotExists<ABFContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public DbSet<BasketItem> BasketItems { get; set; }
public DbSet<Catalogue> Catalogues { get; set; }
// other entities omitted for clarity
}
迁移配置种子数据:
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-ABF-20190304080703.mdf;Initial Catalog=aspnet-ABF-20190304080703;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
在EF 6上:使用Database.SetInitializer方法。 (未经测试的代码)
internal sealed class Configuration : DbMigrationsConfiguration<ABF.DAL.ABFContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(ABF.DAL.ABFContext context)
{
context.CustomerRoles.AddOrUpdate(x => x.Id,
new CustomerRole() { Id = 1, Role = "Member - Current" },
new CustomerRole() { Id = 2, Role = "Member - Previous" },
new CustomerRole() { Id = 3, Role = "Customer" },
new CustomerRole() { Id = 4, Role = "Sponsor" },
new CustomerRole() { Id = 5, Role = "Staff/Volunteer" }
);
// other seed data omitted for clarity
}
}
class MyInitializer : IDatabaseInitializer<MyContext>
{
public void InitializeDatabase(MyContext context)
{
if (context.MyEntities.Any()) return;
// add entities here
}
}
SetInitializer doc:class MyContext : DbContext
{
public MyContext()
{
Database.SetInitializer(new MyInitializer());
}
}
IDatabaseInitializer doc:https://docs.microsoft.com/en-us/previous-versions/visualstudio/gg679461(v=vs.113)
通过将https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.idatabaseinitializer-1?view=entity-framework-6.2.0添加到上下文类,我能够实现这一目标:
Database.Initialize(true);
将连接字符串修改为:
public class ABFContext : DbContext
{
public ABFContext() : base("ABFDatabase")
{
Database.SetInitializer(new CreateDatabaseIfNotExists<ABFContext>());
Database.Initialize(true);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public DbSet<BasketItem> BasketItems { get; set; }
public DbSet<Catalogue> Catalogues { get; set; }
}
并在程序包管理器控制台中运行<add name="ABFDbConnection"
connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
EF命令。这使用相同的代码优先模型在另一台机器上播种并生成update-database
SQL Server数据库文件。