EF CodeFirst Seed方法不会对数据库进行任何更改

时间:2017-02-18 10:34:23

标签: c# entity-framework seeding

我试图通过方法Seed在数据库中插入一些默认值。据我所知,所有代码看起来都完全正确。但是在运行update-database命令后,没有按预期的新记录。可能我错过了一些细节。你能告诉我该如何解决这个问题?

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();
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

与本文http://entityframework.codeplex.com/workitem/1689相关,无法同时使用迁移和“DropCreateDatabaseAlways”作为初始化程序。

  

2013年9月28日上午4:56由RoMiller关闭   EF Team Triage:这是'By Design',是我们在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>());
    }