CreateDatabaseIfNotExists尝试初始化现有数据库

时间:2017-05-13 14:08:02

标签: database entity-framework initialization

我在创建数据库时使用CreateDatabaseIfNotExists,但它不会删除数据库,然后开始初始化它。 有我的DbContext。

public class AppDbContext : DbContext
{
  public AppDbContext() : base("Valtrends")
    {
        InitializeDbContext();
    }

    public DbSet<FactorType> FactorTypes { get; set; }
    public DbSet<ComplexType> ComplexTypes { get; set; }
    public DbSet<Value> Values { get; set; }
    public DbSet<DataLoader.Entities.Version> Versions { get; set; }
    public DbSet<DefaultPlotData> DefaultPlotData { get; set; }
    public DbSet<GraphBucket> GraphBuckets { get; set; }
    public DbSet<XfactorFrom> XfactorsFrom { get; set; }
    public DbSet<XfactorTo> XfactorsTo { get; set; }
    public DbSet<DistributionData> DistributionData { get; set; }
    public DbSet<Bin> Bins { get; set; }
    public DbSet<DefaultPlotSettings> DefaultPlotSettings { get; set; }

    private void InitializeDbContext()
    {
        Database.SetInitializer(new AppDbInitializer());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<FactorType>().HasMany(m => m.CompatibilityListXY).WithMany();
    }

}

}

还有AppDbInitializer的第一部分。

 public class AppDbInitializer : CreateDatabaseIfNotExists<AppDbContext>//DropCreateDatabaseAlways<AppDbContext>
{
    public override void InitializeDatabase(AppDbContext context)
    {
        base.InitializeDatabase(context);
        var jsonImporter = new JsonImporter();
        List<DataLoader.Entities.Version> versions = (jsonImporter.ImportFromJson<List<DataLoader.Entities.Version>>("Versions.json"));
            context.Versions.AddRange(versions);
            context.SaveChanges();  

在SaveChanges之后,我在实体版本上违反了主键异常。

1 个答案:

答案 0 :(得分:1)

  

我在创建数据库时使用CreateDatabaseIfNotExists,但它不会删除数据库然后开始初始化它

它永远不会删除现有数据库。顾名思义,它会检查数据库是否存在,如果是,则不执行任何操作,否则会创建并初始化它。

另请注意,InitializeDatabase的{​​{1}}方法总是被调用,它是实现它的类,负责执行的实际操作。

在您的情况下,您错误地认为基本方法将始终创建新数据库,但实际情况并非如此。如果要添加仅在创建新数据库时执行的代码,则应改为覆盖IDatabaseInitializer方法:

Seed