2017-02-18 52 views
0

我試圖通過方法Seed在數據庫中插入一些默認值。所有代碼看起來都完全正確,據我所知。但是在運行update-database命令後,沒有按預期的方式記錄新的記錄。可能我錯過了一些細節。你能否告訴我如何解決這個問題?EF CodeFirst種子方法不要在數據庫中做任何更改

public class JwtContext : DbContext 
    { 

     public JwtContext() : base("name=Jwt") 
     { 
      Database.SetInitializer(new JwtDbInitializer<JwtContext>()); 
     } 

     public virtual DbSet<Audience> Audience { get; set; } 
     public virtual DbSet<Roles> Roles { get; set; } 
     public virtual DbSet<Users> Users { get; set; } 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Roles>() 
       .HasMany(e => e.Users) 
       .WithRequired(e => e.Roles) 
       .HasForeignKey(e => e.RoleId) 
       .WillCascadeOnDelete(true); 

      modelBuilder.Entity<Audience>() 
       .HasMany(e => e.Users) 
       .WithRequired(e => e.Audiences) 
       .HasForeignKey(e => e.AudienceId) 
       .WillCascadeOnDelete(true); 
     } 
     private class JwtDbInitializer<T> : DropCreateDatabaseAlways<JwtContext> 
     { 
      protected override void Seed(JwtContext context) 
      { 
       base.Seed(context); 
       var audience = new Audience 
       { 
        ClientId = "some_client_id", 
        Base64Secret = "some_secret", 
        Name = "Agromash.Api" 
       }; 
       context.Audience.Add(audience); 
       context.SaveChanges(); 
       IList<Roles> defaultRole = new List<Roles>(); 
       defaultRole.Add(new Roles { Name = "Admin" }); 
       defaultRole.Add(new Roles { Name = "Moder" }); 
       defaultRole.Add(new Roles { Name = "User" }); 
       foreach (var role in defaultRole) 
       { 
        context.Roles.Add(role); 
       } 
       context.SaveChanges(); 
       var user = new Users { Email = "email", IsActive = true, Password = "password", RoleId = 1, AudienceId = 1 }; 
       //SiteGlobal.Email, Password = SiteGlobal.Password 
       context.Users.Add(user); 
       context.SaveChanges(); 
      } 
     } 
    } 
+0

更新數據庫命令=>您使用的EF代碼首先遷移? –

+0

@DanNguyen,是的,沒錯。 –

回答

2

與此相關的文章http://entityframework.codeplex.com/workitem/1689,它不可能在同一時間使用遷移和「DropCreateDatabaseAlways」的初始化。

封閉2013年9月28日在上午04時56分由RoMiller EF團隊分流:這是「通過設計」,是我們參加了EF6故意改變。如果使用此初始化程序創建數據庫,則會將單個條目添加到__MigrationsHistory表中,然後該數據庫將使數據庫不能與遷移一起使用(因爲這些初始化程序不使用您的遷移來創建數據庫)。這在以前的版本中已經混淆了大量人員,因此我們選擇在啓用遷移時不自動創建數據庫/模式。

如果您只想要 希望應用您的遷移,則可以使用MigrateDatabaseToLatestVersion初始值設定項。如果你想刪除數據庫 那麼你可以很容易地將其包裝在一個自定義的初始化程序中,其中包括調用context.Database.Delete()的 。

public JwtContext() : base("name=Jwt") 
    { 
     // to alter the database.This tell the database to close all connection and if a transaction is open to rollback this one. 
     Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction 
      , string.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE", Database.Connection.Database)); 

     Database.Delete(); 
     Database.SetInitializer(new JwtDbInitializer<JwtContext>()); 
    } 
+0

上下文的這種使用將進行遞歸調用。 –

+0

檢查更新:) –

+0

不,它不能正常工作,有關於默認用戶權限的問題。但即使解決這些問題,我想這也行不通。 –

相關問題