2017-02-18 18 views
0

Я пытаюсь вставить некоторые значения по умолчанию в базу данных с помощью метода Seed. Насколько я вижу. Но после запуска команды update-database новых записей не ожидается. Наверное, мне не хватает деталей. Не могли бы вы посоветовать, как я могу это исправить?EF CodeFirst Seed метод не вносит изменений в базу данных

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

команда обновления-базы данных => Вы используете эф код первой миграции? –

+0

@ DanNguyen, да, это так. –

ответ

2

, относящиеся к этой статье http://entityframework.codeplex.com/workitem/1689, это не представляется возможным использовать миграцию и «DropCreateDatabaseAlways» как инициализаторе одновременно.

Closed 28 сентября 2013 в 4:56 утра по RoMiller EF Team классификационные: Это 'By Design' и был намеренным изменением, которое мы приняли в EF6. Если этот инициализатор используется для создания базы данных, в таблицу __MigrationsHistory добавляется одна запись, которая затем выводит базу данных, не подлежащую использованию с миграциями (поскольку эти инициализаторы не используют ваши миграции для создания базы данных). Это путало большое количество людей в предыдущих выпусках, поэтому мы решили не создавать базу/схему автоматически при включении миграции.

Вы можете использовать инициализатор MigrateDatabaseToLatestVersion, если только хотите, чтобы ваши миграции были применены. Если вы хотите удалить базу данных , вы можете легко обернуть ее в пользовательский инициализатор, который включает в себя вызов контекста.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

check update :) –

+0

Нет, это не работает, есть проблема с разрешениями пользователей по умолчанию. Но даже если решить эти проблемы, я полагаю, это не сработает. –