Модель, поддерживающая контекст <Database>, изменилась с момента создания базы данных - PullRequest
239 голосов
/ 30 августа 2010

Сообщение об ошибке:

"Модель, поддерживающая контекст 'AddressBook', изменилась с момента создания базы данных. Либо удалите / обновите базу данных вручную, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer. Например, стратегия RecreateDatabaseIfModelChanges автоматически удалит и повторно создаст базы данных и, возможно, заполнить ее новыми данными. "

Я пытаюсь использовать первую функцию кода, и вот что я написал:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

Контекстный класс:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

и строка подключения:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

Итак, имя базы данных - «Адресная книга», и возникает ошибка, когда я пытаюсь добавить объект контакта в контекст. Я что-то здесь упускаю?

Ответы [ 27 ]

0 голосов
/ 29 сентября 2015

Здесь я хочу поделиться другим методом, который предотвращает ошибку поддержки модели при изменении контекста:

1) Откройте файл DbContext

2) Добавить пространство имен с помощью Microsoft.AspNet.Identity.EntityFramework;

3) public MyDbContext (): base ("name = MyDbContext") { Database.SetInitializer (new DropCreateDatabaseAlways ()); }

0 голосов
/ 04 августа 2015

Хорошее предложение, однако, не так точно во всех случаях. Я понял один. Пожалуйста, убедитесь, что вы запускаете «enable-migrations» с помощью окон PM в Visual Studio, и папка Migration будет добавлена ​​в ваш проект.

Убедитесь, что два файла класса c #, добавленные в папку, будут содержать все ваши модели и соответствующие им свойства.

Если у вас есть все это для создания решения и публикации для развертывания.

Логика заключается в том, что существующие метаданные не могут быть перезаписаны, поскольку в вашем приложении нет метаданных для замены текущих. В результате вы получаете эту ошибку «Модель, поддерживающая контекст, изменилась с момента создания базы данных»

0 голосов
/ 15 июня 2015

Это странно, но все ответы здесь были для меня бесполезны. У меня работал инициализатор

MigrateDatabaseToLatestVersion

Вот мое решение (я знаю, это может быть намного проще, но это то, как я его использую):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting просто наследуется от DropCreateDatabaseAlways, поэтому в некоторых случаях (тестирование) вся база данных перестраивается В противном случае он переносится на последнюю версию.

Мой источник: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

0 голосов
/ 28 сентября 2014

Попробуйте использовать Database SetInitializer, который относится к использованию System.Data.Entity;

В Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

Это создаст новую базу данных при каждом изменении вашей модели. Но ваша база данныхбудет пустым. Для того, чтобы заполнить его фиктивными данными, вы можете использовать Seeding.Что вы можете реализовать как:

Seeding ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}
0 голосов
/ 03 февраля 2014

Проверьте следующие шаги

  1. Database.SetInitializer (null);-> в Global.asax.cs

2.

  1. имя вашего класса контекста должно совпадать с галочкой
0 голосов
/ 23 июля 2018

Создать пользовательский инициализатор контекста:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

Обратите внимание, что Migrations.Configuration - это класс, генерируемый с помощью командной строки миграции в консоли диспетчера пакетов.Вам может потребоваться изменить внутренний на публичный модификатор класса Migrations.Configuration.

и зарегистрировать его в OmModelCreating:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}
0 голосов
/ 01 сентября 2014

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

У меня была эта ошибка, потому что я неправильно назвал локальную базу данных (глупая ошибка), а имя строки подключения в web.config «DefaultConnection» не совпадает с MyDbContext, т. Е.

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>
...