2017-10-13 82 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中創建數據庫」的錯誤消息。這意味着我的數據庫正在使用中。然後,我寫了一個查詢「使用主」,然後我再次運行。就這樣。問題已解決,我的初始化程序正在工作。感謝大家!

相關問題