net mvc from asp asp.net-mvc-4 entity-framework-5 ef-migrations code-first-migrations

asp.net mvc 4 - mvc - Migraciones automáticas para ASP.NET SimpleMembershipProvider



razor partial (3)

Lo que parece que sucedió aquí es que habilitó las migraciones y luego ejecutó la aplicación. Al ejecutar la aplicación antes de utilizar el comando UpdateDatabase, EntityFramework habría creado y llenado la base de datos, pero desde que habilitó las migraciones la base de datos no existía, no creó la migración InitialCreate. Las migraciones aún piensan que tiene una base de datos vacía y quiere crear todos los objetos en su modelo

Lo que puede intentar es volver a habilitar migraciones que generarán una migración InitialCreate que refleje el estado actual de la base de datos. En este caso, guardaría los cambios que realizó en el método de inicialización en lugar de ejecutar "Habilitar-Migraciones-Fuerza", esto debería recrear la migración y generar una migración de IntialCreate. A continuación, puede volver a llenar su método de inicialización y ejecutar el comando UpdateDatabase.

Así que traté de usar migraciones automáticas con mi nuevo Proyecto MVC 4 pero de alguna manera no está funcionando. Seguí esta publicación de blog paso a paso.

He agregado los cambios al modelo de cuenta UserProfile (el campo NotaryCode ):

[Table("UserProfile")] public class UserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public string UserName { get; set; } public int NotaryCode { get; set; } }

Luego escribí en la consola del gestor de paquetes enable-migrations y apareció una clase de configuración (hereda de DbMigrationsConfiguration<Web.Models.UsersContext> ) y luego DbMigrationsConfiguration<Web.Models.UsersContext> la clase como:

public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed(Atomic.Vesper.Cloud.Web.Models.UsersContext context) { WebSecurity.InitializeDatabaseConnection( "DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); if (!Roles.RoleExists("Atomic")) Roles.CreateRole("Atomic"); if (!Roles.RoleExists("Protocolista")) Roles.CreateRole("Protocolista"); if (!Roles.RoleExists("Cliente")) Roles.CreateRole("Cliente"); string adminUser = "randolf"; if (!WebSecurity.UserExists(adminUser)) WebSecurity.CreateUserAndAccount( adminUser, "12345", new { NotaryCode = -1 }); if (!Roles.GetRolesForUser(adminUser).Contains("Atomic")) Roles.AddUsersToRoles(new[] { adminUser }, new[] { "Atomic" }); }

Y luego traté de ejecutar update-database -verbose pero esto no funciona. Quiero decir, este es el resultado:

Ya hay un objeto llamado ''UserProfile'' en la base de datos.

PM> update-database -verbose Using StartUp project ''Web''. Using NuGet project ''Web''. Specify the ''-Verbose'' flag to view the SQL statements being applied to the target database. Target database is: ''VesperCloud'' (DataSource: ./SQLSERVER, Provider: System.Data.SqlClient, Origin: Configuration). No pending code-based migrations. Applying automatic migration: 201211051825098_AutomaticMigration. CREATE TABLE [dbo].[UserProfile] ( [UserId] [int] NOT NULL IDENTITY, [UserName] [nvarchar](max), [NotaryCode] [int] NOT NULL, CONSTRAINT [PK_dbo.UserProfile] PRIMARY KEY ([UserId]) ) System.Data.SqlClient.SqlException (0x80131904): There is already an object named ''UserProfile'' in the database. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId:a7da0ddb-bccf-490f-bc1e-ecd2eb4eab04 **There is already an object named ''UserProfile'' in the database.**

Sé que el objeto existe. Quiero decir, trato de usar migraciones automáticas para, precisamente, modificar y ejecutar sin volver a crear manualmente la base de datos. Pero de alguna manera esto no está funcionando.

Miro la documentación de MSDN y encontré la propiedad:

AutomaticMigrationDataLossAllowed = true;

Pero establecerlo en verdad no cambia nada. Supongo que me estoy perdiendo algo, pero de alguna manera no encuentro qué. ¿Alguna idea?


Tenía lo mismo y ordené de otra manera. Fui a mi db local borré el perfil de usuario y otras tablas que tienen restricciones de clave externa en las páginas web_membership, webpages_OAuthMembership, webpages_Roles, webpages_UsersInRoles tablas. Todos estos se recrearán cuando ejecute update-database -verbose.


update-database -verbose no funciona porque su modelo ha sido cambiado después de que su tabla de datos ya existía.

Primero, asegúrese de que no haya cambios en la clase UserProfile. Entonces corre:

Add-Migration InitialMigrations -IgnoreChanges

Esto debería generar un archivo en blanco "InitialMigration". Ahora, agregue los cambios deseados a la clase UserProfile. Una vez que se agreguen los cambios, ejecute el comando de actualización nuevamente:

update-database -verbose

Ahora se aplicará la migración automática y la tabla se verá alterada con sus cambios.