【问题标题】:Database Initializer not being called in EF 5 + MVC 3EF 5 + MVC 3 中未调用数据库初始化程序
【发布时间】:2012-09-24 22:41:18
【问题描述】:

我知道这个问题可能是重复的,但我还没有找到任何解决我的问题的方法。

我有:

protected void Application_Start()
        {
            Database.SetInitializer(new DatabaseSeeder());
            DatabaseContext c = new DatabaseContext();
            c.Database.Initialize(true);

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);


        }

我的数据库播种机是:

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>
    {
        protected override void Seed(DatabaseContextBase context)
        {
            base.Seed(context);

            var roles = new[] {"Admin", "User"};
            foreach (var role in roles)
            {
                context.Roles.Add(new UserRole {FullName = role});
            }

            context.SaveChanges();
        }
    }

我的上下文是:

public abstract class DatabaseContextBase : DbContext
    {
        public DbSet<UserRole> Roles { get; set; }
        public DbSet<UserAndPermissionInGroup> UserAndPermissions { get; set; }
        public DbSet<GeneralUser> Users { get; set; }
        public DbSet<Group> Groups { get; set; }
        public DbSet<Forum> Forums { get; set; } 

        public DatabaseContextBase() :base("ForumDb")
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Comment>()
                .HasRequired(e => e.Owner)
                .WithMany(t => t.Comments)
                .HasForeignKey(e => e.OwnerId)
                .WillCascadeOnDelete(false);
        }
    }

最后:

public class DatabaseContext : DatabaseContextBase

{

}

问题是,即使使用此初始化程序,我也会收到以下错误:

支持“DatabaseContext”上下文的模型自 数据库已创建。考虑使用 Code First 迁移来更新 数据库

我首先在 ASP.NET MVC 3 项目中使用 EF 5 代码。有什么建议吗?

【问题讨论】:

  • 尝试重建您的项目,如果您可能丢失数据,因为我遇到的问题是即使我使用 DropCreateDatabaseAlways 也没有删除和重新创建数据库。重建总是重新创建数据库。
  • “考虑使用 Code First 迁移来更新数据库”

标签: asp.net-mvc entity-framework ef-code-first entity-framework-migrations


【解决方案1】:

看起来 Database.SetInitializer 不适用于派生类型。我从

更改了初始化程序
public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>

到

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContext>

现在是代码:

Database.SetInitializer(new DatabaseSeeder());
DatabaseContext c = new DatabaseContext();
c.Database.Initialize(true);

效果很好。谢谢大家的回答。

【讨论】:

  • 很高兴知道。您应该考虑改用 Initialize(false)。如果你知道你为什么通过 true,请忽略我。
  • 这救了我!谢谢!
  • “数据库”类是你自己的吗?
【解决方案2】:

如果您擅长丢失数据,当您更改模型时,请尝试以下操作。

DatabaseSeeder : DropCreateDatabaseIfModelChanges<DatabaseContextBase>

代替

DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>

这样,当您对模型进行更改时,您的数据库将使用您的最新模型重新创建,并且将调用种子方法。

如果你想保留你的数据,你应该开始阅读迁移。

  1. Code-First Migrations
  2. Automatic Migrations

【讨论】:

  • 不幸的是,这无济于事。似乎 Database.SetInitializer 不适用于派生类型。
  • 它在我当前的项目中为我工作。然后我在生产前切换到迁移。
【解决方案3】:

类似以下内容?

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions
            .Remove<System.Data.Entity.Database.IncludeMetadataConvention>()
            .Entity<Comment>()
            .HasRequired(e => e.Owner)
            .WithMany(t => t.Comments)
            .HasForeignKey(e => e.OwnerId)
            .WillCascadeOnDelete(false);
    }

【讨论】:

    【解决方案4】:

    我不确定这是否可行,但你能做这样的事情吗?

    DatabaseSeeder<TContextType> : DropCreateDatabaseAlways<TContextType> where TContextType : DatabaseContextBase
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2011-10-10
      • 2013-11-12
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多