2017-02-18 50 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

不,它不能正常工作,有关于默认用户权限的问题。但即使解决这些问题,我想这也行不通。 –

相关问题