Инициализатор базы данных не вызывается в EF 5 + MVC 3

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

У меня есть:

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 Migrations для обновления базы данных.

Сначала я использую код EF 5 в проекте ASP.NET MVC 3. Какие-либо предложения?


person TapiocaCom    schedule 24.09.2012    source источник
comment
Попробуйте перестроить свой проект, если вы можете потерять данные, потому что у меня были проблемы с тем, что база данных не удалялась и не создавалась заново, даже если я использовал DropCreateDatabaseAlways. Rebuild всегда воссоздает базу данных.   -  person gljivar    schedule 25.09.2012
comment
Рассмотрите возможность использования Code First Migrations для обновления базы данных.   -  person Pawel    schedule 26.09.2012


Ответы (4)


Похоже, Database.SetInitializer не работает для производных типов. Я изменил инициализатор с

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>

to

public class DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContext>

а теперь код:

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

работает довольно хорошо. Спасибо за все ответы.

person TapiocaCom    schedule 26.09.2012
comment
Хорошо знать. Вместо этого вам следует рассмотреть возможность использования Initialize(false). Если вы знаете, почему вы передаете правду, просто игнорируйте меня. - person Victor Pascoal Souza; 08.04.2014
comment
Это спасло меня! Благодарю вас! - person j_fulch; 15.10.2014
comment
Является ли класс базы данных вашим собственным? - person piofusco; 13.02.2015

Если вы хорошо справляетесь с потерей своих данных, когда вы вносите изменения в свои модели, попробуйте выполнить следующее.

DatabaseSeeder : DropCreateDatabaseIfModelChanges<DatabaseContextBase>

Вместо

DatabaseSeeder : DropCreateDatabaseAlways<DatabaseContextBase>

Таким образом, когда вы вносите изменения в свою модель, ваша база данных будет воссоздана с использованием ваших последних моделей, и будет вызываться начальный метод.

Если вы хотите сохранить свои данные, вы должны начать читать о миграции.

  1. Код -Первые миграции
  2. Автоматическая миграция< /а>
person emre nevayeshirazi    schedule 24.09.2012
comment
К сожалению, это не помогает. Похоже, что Database.SetInitializer не работает для производных типов. - person TapiocaCom; 26.09.2012
comment
Это работало на меня в моем текущем проекте. Затем я переключился на миграции непосредственно перед производством. - person emre nevayeshirazi; 26.09.2012

Что-то вроде следующего?

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);
    }
person Grixxly    schedule 24.09.2012

Я не уверен, что это сработает, но не могли бы вы сделать что-то подобное?

DatabaseSeeder<TContextType> : DropCreateDatabaseAlways<TContextType> where TContextType : DatabaseContextBase
person Merwer    schedule 06.11.2012