El modelo que respalda el contexto <Base de datos> ha cambiado desde que se creó la base de datos.
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í?
Ahora es:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<YourDbContext>(null);
base.OnModelCreating(modelBuilder);
}
en su archivo YourDbContext.cs.
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.SetInitializer
con unaIDatabaseInitializer
instancia".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
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.
Simplemente ejecute el siguiente comando sql en SQL Server Management Studio:
delete FROM [dbo].[__MigrationHistory]