2017-10-13 133 views
0

我无法弄清楚为什么我的初始化程序不起作用。我正在使用EF Code First创建数据库,并且我希望使用初始化方法在数据库创建时使用默认值填充数据库。但每当我尝试时,我的数据库正在创建,但初始化程序不起作用,并且表中没有数据,我想用一些默认值进行初始化。我错过了什么吗?如果我错了,那么使用初始化器的正确方法是什么?

注意:我不想使用Configuration.cs为我的数据库播种,我想使用我的自定义初始值设定项。

DataContext.cs
带EF代码优先的数据库初始化程序

namespace WebApplication1.Data.Context 
{ 
    public class DataContext : DbContext 
    { 
     public DataContext() : base("name=MyDB") 
     { 
      Database.SetInitializer<DataContext>(new DropCreateDatabaseAlways<DataContext>()); 
     } 

     public DbSet<Category> Categories { get; set; } 
    } 
} 

CategoryInitializer.cs

namespace WebApplication1.Data.Initializers 
{ 
    public class CategoryInitializer : DropCreateDatabaseIfModelChanges<DataContext> 
    { 
     protected override void Seed(DataContext context) 
     { 
      GetCategories().ForEach(c => context.Categories.Add(c)); 
      context.SaveChanges(); 
      base.Seed(context); 
     } 
     private static List<Category> GetCategories() 
     { 
      var categories = new List<Category> 
      { 
       new Category {CategoryID = 1, CategoryName = "Category 1" }, 
       new Category {CategoryID = 2, CategoryName = "Category 2"}, 
       new Category {CategoryID = 3, CategoryName = "Category 3"} 
      }; 
      return categories; 
     } 
    } 
} 

Category.cs

namespace WebApplication1.Data.Model 
{ 
    public class Category 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int CategoryID { get; set; } 
     public string CategoryName { get; set; } 
    } 
} 
+0

你正在设置一个标准的初始值设定项而不是你自己,它应该是'Database.SetInitializer (新的CategoryInitializer());' –

+0

我也是这样做的,但是不工作。 –

+0

您在'SetInitializer'语句后缺少'Database.Initialize(true);'。 ;-) – LocEngineer

回答

0

更改您的DataContext这样:

public DataContext() : base("name=MyDB") 
{ 
    Database.SetInitializer<DataContext>(new CategoryInitializer<DataContext>()); 
    Database.Initialize(true); 
} 

而且你初始化这个:

public class CategoryInitializer<T> : DropCreateDatabaseIfModelChanges<DataContext> 
{ 
    public override void InitializeDatabase(DataContext context) 
    { 
     context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction 
      , $"ALTER DATABASE [{context.Database.Connection.Database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 

     base.InitializeDatabase(context); 
     context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction 
      , $"ALTER DATABASE [{context.Database.Connection.Database}] SET MULTI_USER WITH ROLLBACK IMMEDIATE"); 
    } 

    protected override void Seed(DataContext context) 
    { 
     //Do your stuff 
    } 

而且介意在初始化的<T>InitializeDatabase中的两条陈述只是为了确保正确的迁移。

+0

我实现了这个代码,但仍然无法工作 –

+0

PLease对于“不能正常工作”更精确一点你有错误吗?你是否首先启用了Migrations? – LocEngineer

+0

等一秒钟,@RıdvanSÖYÜ,为什么DataContext和Initializer之间有两个不同的命名空间?实际上:为什么你有三个不同的命名空间? – LocEngineer

0

我解决了这个问题。我正在使用所有数据作品的类库。因此,为了逐步调试,我将类库的输出类型更改为Windows应用程序,并进行测试,我写了一个类。当我一步一步地运行代码时,它给了我一个“无法删除并在sql server中创建数据库”的错误消息。这意味着我的数据库正在使用中。然后,我写了一个查询“使用主”,然后我再次运行。就这样。问题已解决,我的初始化程序正在工作。感谢大家!