El modelo que respalda el contexto <Base de datos> ha cambiado desde que se creó la base de datos.

Resuelto Ashish Gupta asked hace 14 años • 27 respuestas

El mensaje de error:

"El modelo que respalda el contexto 'AddressBook' ha cambiado desde que se creó la base de datos. Elimine/actualice manualmente la base de datos o llame a Database.SetInitializer con una instancia de IDatabaseInitializer. Por ejemplo, la estrategia RecreateDatabaseIfModelChanges eliminará y recreará automáticamente la base de datos, y Opcionalmente, siémbrelo con nuevos datos".

Estoy intentando utilizar la función de código primero y lo siguiente es lo que escribí:

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

La clase de contexto:

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

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

y la cadena de conexión:

<?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>

Entonces, el nombre de la base de datos es "Libreta de direcciones" y el error ocurre cuando intento agregar el objeto de contacto al contexto. ¿Me estoy perdiendo algo aquí?

Ashish Gupta avatar Aug 30 '10 19:08 Ashish Gupta
Aceptado

Ahora es:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

en su archivo YourDbContext.cs.

Matt Frear avatar May 26 '2011 18:05 Matt Frear

Aquí hay información del blog de Scott Gu publicado por Jeff sobre lo que realmente está sucediendo:

Para aquellos que ven esta excepción:

"El modelo que respalda el contexto de 'Producción' ha cambiado desde que se creó la base de datos. Elimine/actualice manualmente la base de datos o llame Database.SetInitializercon una IDatabaseInitializerinstancia".

Esto es lo que está pasando y qué hacer al respecto:

Cuando se crea un modelo por primera vez, ejecutamos un DatabaseInitializer para hacer cosas como crear la base de datos si no está allí o agregar datos iniciales. El DatabaseInitializer predeterminado intenta comparar el esquema de base de datos necesario para usar el modelo con un hash del esquema almacenado en una tabla EdmMetadata que se crea con una base de datos (cuando Code First es quien crea la base de datos). Las bases de datos existentes no tendrán la tabla EdmMetadata y, por lo tanto, no tendrán el hash... y la implementación actual arrojará resultados si falta esa tabla. Trabajaremos para cambiar este comportamiento antes de enviar la versión fial, ya que es la predeterminada. Hasta entonces, las bases de datos existentes generalmente no necesitan ningún inicializador de base de datos, por lo que se puede desactivar para su tipo de contexto llamando a:

Database.SetInitializer<YourDbContext>(null);

jeff

Randy avatar Jun 02 '2011 11:06 Randy

Para Entity Framework 5.0.0.0 - 6.1.3

De hecho, usted desea hacer lo siguiente:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

Sí, Matt Frear tiene razón. ACTUALIZACIÓN -EDITAR: La advertencia es que estoy de acuerdo con otros en que en lugar de agregar este código a global.asax agregado a su clase DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

Como otros mencionaron, esto también es bueno para manejar las pruebas unitarias.

Actualmente estoy usando esto con Entity Framework 6.1.3 /.net 4.6.1

Volveré para proporcionar un fragmento de CORE en un futuro próximo.

Tom Stickel avatar Feb 21 '2013 02:02 Tom Stickel

Simplemente ejecute el siguiente comando sql en SQL Server Management Studio:

delete FROM [dbo].[__MigrationHistory]
Shafqat avatar Jun 21 '2016 17:06 Shafqat