2017-05-13 22 views
0

我在創建數據庫時使用CreateDatabaseIfNotExists,但它只是不刪除數據庫,然後開始初始化它。 有我的DbContext。CreateDatabaseIfNotExists嘗試初始化現有的數據庫

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

創建數據庫時,我使用CreateDatabaseIfNotExists,但它只是不刪除該數據庫,然後開始初始化它

就再也不會降到現有的數據庫。顧名思義,它會檢查數據庫是否存在,如果存在,則不執行任何操作,否則會創建並初始化它。

還要注意的是IDatabaseInitializerInitializeDatabase方法是總是叫,那就是實現它負責執行什麼實際操作的類。

在你的情況下,你錯誤地認爲基方法總是會創建新的數據庫,事實並非如此。如果要添加僅在創建新數據庫時才執行的代碼,則應改爲使用Seed方法:

public class AppDbInitializer : CreateDatabaseIfNotExists<AppDbContext> 
{ 
    protected override void Seed(AppDbContext context) 
    { 
     var jsonImporter = new JsonImporter(); 
     List<DataLoader.Entities.Version> versions = (jsonImporter.ImportFromJson<List<DataLoader.Entities.Version>>("Versions.json")); 
     context.Versions.AddRange(versions); 
     context.SaveChanges(); // you don't need this, it's automatically called after `Seed` call 
    } 
}