Code First Migration, můžete aktualizovat změny modelu ve vašem kódu v databázi, pro použití Code First Migration ji musíte nejdřív otevřít:
V konzoli Tools-NuGet Package Manager-Package Manager napište: Enable-Migrations -ContextTypeName Code FirstExistingDB.DataModel.StoreContext stiskněte Enter. (Všimněte si, že musíte definovat kontext, který chcete použít, protože autentizační kontext se automaticky vytvoří při vytvoření projektu.) Po dokončení se vytvoří složka Migrations, která obsahuje třídu Configuration.cs.
V tomto bodě je potřeba další krok, aby Code First fungoval – pokud nyní vytvoříte migraci, pokusí se přidat kontextovou entitu do databáze, ale migrace selže, protože tabulky Produkty a kategorie už v databázi existují. Nejprve tedy musíme vytvořit migraci, která je inicializována na empty, a pak můžeme přidat migraci k jakýmkoli úpravám.
PM> Aktualizace-databáze Zadejte příznak "-Verbose" pro zobrazení SQL příkazů aplikovaných na cílovou databázi. Žádné probíhající explicitní migrace. Aplikace automatické migrace: 201806070740457_AutomaticMigration. System.Data.SqlClient.SqlException (0x80131904): Objekt s názvem 'Account' již v databázi existuje. 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) In 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, Boolean asyncWrite) In System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource'1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) In System.Data.SqlClient.SqlCommand.ExecuteNonQuery() In System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <NonQuery>b__0(DbCommand t, DbCommandInterceptionContext'1 c) In System.Data.Entity.Infrastructure.Interception.InternalDispatcher'1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func'3 operation, TInterceptionContext interceptionContext, Action'3 vykonává, Action'3 vykonává) In System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) In System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() In System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) V System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction transaction , DbInterceptionContext interceptionContext) V System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable'1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) In System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable'1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) In System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable'1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) In System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable'1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable'1 migrationStatements, DbConnection connection) na System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass32. <ExecuteStatements>b__30() V System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1. <Execute>b__0() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func'1 operation) V System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) V System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable'1 migrationStatements, DbTransaction existingTransaction) In System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable'1 migrationStatements) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable'1 migrationStatements) In System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable'1 operations, IEnumerable'1 systemOperations, Boolean Downgrade, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading) In System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean Downgrade) 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.UpdateInternal(String targetMigration) V System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClasse. <Update>b__d() at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) V System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() In System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
ClientConnectionId:dcf676a8-d2b3-4232-89dd-35e15fb8160d Chybové číslo: 2714, Stát: 6, Třída: 16 Objekt s názvem 'Účet' již v databázi existuje.
Pokud narazíte na výše uvedenou chybu, zadejte do konzole správce balíčků Add-Migration InitialCreate -IgnoreChanges pro vytvoření prázdné migrace.
Logo IgnoreChanges slouží k zajištění, že se s touto migrací nic nedělá. Tímto způsobem se v databázi vytvoří tabulka migrací, což je snímek databáze před její migrací.
Dále zadejte update-database v konzoli správce balíčků, abyste aktualizovali migraci inicializace do databáze.
Po inicializaci migrace aktualizujte databázi pomocí Code First Migration:
Přidejte sloupec Descrip{filter}tion do tabulky Produkt a nastavte délku na 50, ([StringLength(50)]); Nyní přidejte novou migraci pro aktualizaci změn v databázi.
V konzoli Správce balíčků zadejte následující:Add-Migration add_product_descrip{filter}tion, (add_product_descrip{filter}tion) přidá soubor do složky Migrations, který popisuje migraci. Dále v konzoli Správce balíčků napište:
update-database, nový sloupec bude přidán do tabulky Produkty.
|