Falha na atualização do banco de dados no console do gerenciador de pacotes. Eu usei o Entity Framework 6.xe a abordagem de código primeiro. Erro é
"Já existe um objeto chamado 'AboutUs' no banco de dados."
Como posso resolver esse problema?
internal sealed class Configuration
: DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
{
}
}
Meu DbContext é:
public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
public JahanBlogDbContext()
: base("name=JahanBlogDbConnectionString")
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<JahanBlogDbContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Role>().ToTable("Role");
modelBuilder.Entity<UserRole>().ToTable("UserRole");
modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
}
public virtual DbSet<Article> Articles { get; set; }
public virtual DbSet<ArticleLike> ArticleLikes { get; set; }
public virtual DbSet<ArticleTag> ArticleTags { get; set; }
public virtual DbSet<AttachmentFile> AttachmentFiles { get; set; }
public virtual DbSet<Comment> Comments { get; set; }
public virtual DbSet<CommentLike> CommentLikes { get; set; }
public virtual DbSet<CommentReply> CommentReplies { get; set; }
public virtual DbSet<ContactUs> ContactUs { get; set; }
public virtual DbSet<Project> Projects { get; set; }
public virtual DbSet<ProjectState> ProjectStates { get; set; }
public virtual DbSet<ProjectTag> ProjectTags { get; set; }
public virtual DbSet<Rating> Ratings { get; set; }
public virtual DbSet<Tag> Tags { get; set; }
public virtual DbSet<AboutUs> AboutUs { get; set; }
}
Console de gerenciamento de pacotes:
PM> update-database -verbose -force
Using StartUp project 'Jahan.Blog.Web.Mvc'.
Using NuGet project 'Jahan.Blog.Web.Mvc'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Jahan-Blog' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201410101740197_AutomaticMigration.
CREATE TABLE [dbo].[AboutUs] (
[Id] [int] NOT NULL IDENTITY,
[Description] [nvarchar](max),
[IsActive] [bit] NOT NULL,
[CreatedDate] [datetime],
[ModifiedDate] [datetime],
CONSTRAINT [PK_dbo.AboutUs] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AboutUs' 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, Boolean asyncWrite)
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.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
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, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel 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.UpdateInternal(String targetMigration)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
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)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:88b66414-8776-45cd-a211-e81b2711c94b
There is already an object named 'AboutUs' in the database.
PM>
database
entity-framework
ef-code-first
entity-framework-6
ef-migrations
Disse Roohullah Allem
fonte
fonte
Respostas:
parece que há um problema no processo de migração, execute o comando add-migration em "Package Manager Console":
faça algumas alterações e, em seguida, atualize o banco de dados do arquivo "Inicial":
Editar: -IgnoreChanges está no EF6, mas não no EF Core, aqui está uma solução alternativa: https://stackoverflow.com/a/43687656/495455
fonte
Talvez você tenha alterado o namespace em seu projeto!
Existe uma tabela em seu banco de dados chamada
dbo.__MigrationHistory
. A tabela possui uma coluna chamadaContextKey
.O valor desta coluna é baseado em seu
namespace
. por exemplo, é "DataAccess.Migrations.Configuration
".Quando você altera o namespace, isso causa nomes de tabela duplicados com namespaces diferentes.
Portanto, depois de alterar o namespace no lado do código, altere também o namespace nesta tabela no banco de dados (para todas as linhas).
Por exemplo, se você alterar o namespace para
EFDataAccess
, deverá alterar os valores daContextKey
coluna emdbo.__MigrationHistory
para "EFDataAccess.Migrations.Configuration
".Em seguida, no lado do código, em Ferramentas => Console do gerenciador de pacotes, use o
update-database
comando.Outra opção em vez de alterar o valor de contexto no banco de dados é codificar permanentemente o valor de contexto em seu código para o valor de namespace antigo. Isso é possível herdando
DbMigrationsConfiguration<YourDbContext>
e no construtor apenas atribuindo o valor de contexto antigo paraContextKey
, do que herdandoMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
e deixando essa classe vazia. A última coisa a fazer é chamarDatabase.SetInitializer(new YourDbInitializer());
seu DbContext em um construtor estático.Espero que seu problema seja resolvido.
fonte
MigrationHistory
tabela não corrigiu para mim ... então eu larguei todas as minhas tabelas e deixei EF criar todas elas de novo, pequeno aplicativo, nada demais. ..mas consertou para mim.Esta exceção informa que alguém já adicionou um objeto chamado 'AboutUs' ao banco de dados.
AutomaticMigrationsEnabled = true;
pode levar a isso, uma vez que as versões do banco de dados não são controladas por você neste caso. Para evitar migrações imprevisíveis e garantir que todos os desenvolvedores da equipe trabalhem com a mesma estrutura de banco de dados que sugiro que você definaAutomaticMigrationsEnabled = false;
.Migrações automáticas e migrações codificadas podem coexistir se você for muito cuidadoso e for o único desenvolvedor em um projeto.
Há uma citação da postagem Automatic Code First Migrations no Data Developer Center :
fonte
No meu caso, minha
EFMigrationsHistory
mesa estava vazia (de alguma forma) e ao tentar correrupdate-database
eu obteria:Depois de ver a tabela ter sido esvaziada, fez sentido que ele estivesse tentando executar novamente a migração inicial e tentar recriar as tabelas.
Para corrigir esse problema, adicionei linhas à minha
EFMigrationsHistory
tabela. 1 linha para cada migração que eu sabia que o banco de dados estava atualizado.Uma linha terá 2 colunas:
MigrationId
eProductVersion
MigrationId
é o nome do seu arquivo de migração. Exemplo:20170628112345_Initial
ProductVersion
é a versão ef que você está executando. Você pode encontrar isso digitandoGet-Package
no Console do gerenciador de pacotes e procurando seu pacote ef.Espero que isso seja útil para alguém.
fonte
No meu caso, renomeei o assembly que continha o modelo de estrutura de entidade codificado primeiro. Embora o esquema real não tenha mudado em todas as tabelas de migrações chamadas
contém uma lista de migrações já realizadas com base no antigo nome do assembly. Atualizei o nome antigo na tabela de migrações para corresponder ao novo e a migração funcionou novamente.
fonte
Certifique-se de que seu projeto de inicialização de soluções tenha a cadeia de conexões correta no arquivo de configuração. Ou defina o parâmetro -StartUpProjectName ao executar o comando update-database. O parâmetro -StartUpProjectName especifica o arquivo de configuração a ser usado para strings de conexão nomeadas. Se omitido, o arquivo de configuração do projeto especificado é usado.
Aqui está um link para referências de comando ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/
fonte
Eu tive o mesmo problema e depois de três horas lutando descubro o que está acontecendo
No meu caso, quando eu quis migrar pela primeira vez no
up()
método, o código padrão quer criar as tabelas que já existiam então eu obtive o mesmo erro que vocêPara resolver isso, basta deletar o código e escrever o que quiser. Por exemplo, eu queria adicionar uma coluna, então apenas escrever
fonte
@
seguido do meu nome de usuário na seção de comentários.Nota: solução não recomendada. mas solução rápida em alguns casos.
Para mim, o
dbo._MigrationHistory
banco de dados de produção perdeu registros de migração durante o processo de publicação, mas o banco de dados de desenvolvimento tinha todos os registros de migração.Se você tiver certeza de que o banco de dados de produção possui o mesmo e mais novo esquema em comparação ao dev db, copiar todos os registros de migração para o banco de dados de produção pode resolver o problema.
Você pode fazer apenas com VisualStudio.
dbo._MigrationHistory
na tabela no banco de dados de origem (no meu caso, dev db)> Clique no menu "Comparação de dados ...".Observe que, novamente, não é recomendado em projetos complexos e sérios. Use isso apenas se tiver problemas durante o aprendizado ASP.Net ou EntityFramework.
fonte
Exclua linhas da tabela dbo_MigrationHistory ou exclua a tabela e execute
Ele executará todas as migrações em seu projeto, uma por uma
fonte
No meu caso, o problema estava no Seeder. Eu estava chamando _ctx.Database.EnsureCreated () dentro dele e, pelo que entendi, o comando de atualização do banco de dados foi executado com sucesso, mas o semeador tentou criar o banco de dados "segunda" vez.
Como abordar:
fonte
Outro cenário EF Core.
Verifique se você tem um arquivo Migrations / YOURNAMEContextModelSnapshot.cs .
conforme detalhado em - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration
Se você tentou recriar manualmente o banco de dados excluindo os arquivos migration.cs, tome cuidado para que o arquivo Migrations / * ContextModelSnapshot.cs ainda exista.
Sem ele, suas migrações subsequentes não têm instantâneo no qual criar as diferenças necessárias e seus novos arquivos de migração parecerão que estão recriando tudo do zero, então você obterá o erro de tabela existente como acima.
fonte
O mesmo aconteceu comigo .. O problema foi que na verdade eu apaguei minha tabela do banco de dados
MoviesCast
e fiz uma nova tabela e o problema foi que minha última migração estava tentando induzir a tabela excluídaMoviesCast
no banco de dados. Resolvi simplesmente removendo todo o conteúdo da última migração e simplesmente executei o método Up () e down ()em seguida, atualizou o banco de dados e simplesmente adicionou uma nova migração
fonte
Tive o mesmo problema descrito na resposta que Elnaz deu. Tive a necessidade de alterar o namespace da camada de dados durante uma refatoração de nosso projeto. Isso fez com que as migrações não vissem as migrações existentes no banco de dados. Eu encontrei uma resposta excelente para esta questão que James Chambers blogou.
http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/
Simplesmente alterei o seguinte no arquivo de configuração de migração.
Espero que isso ajude alguém em apuros.
fonte
Simplesmente execute o comando update-migration -Script. Isso gera um novo script * .sql que inclui todas as alterações do banco de dados incluídas na migração. No final do código estão os comandos de inserção mais ou menos assim: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) você pode simplesmente executar o INSERT e o DB será sincronizado
fonte
Depois de mais de uma hora sem obter nenhum resultado, tentei outra abordagem, não usando migrações, mas fiz uma comparação de esquema.
No Visual Studio -> Ferramentas -> SQL Server -> Nova Comparação de Esquema
Primeiro criei um banco de dados completamente novo com migrações EF. Então fiz uma comparação, comparando o novo banco de dados com o que eu queria atualizar. Finalmente gerei um script de migração e pude realizar uma atualização de esquema.
fonte
No meu caso (quero redefinir e obter um novo banco de dados),
Primeiro recebo a mensagem de erro:
There is already an object named 'TABLENAME' in the database.
e eu vi, um pouco antes:
Meu banco de dados foi criado, mas nenhum registro no histórico de migrações.
Excluo todas as tabelas, exceto dbo .__ MigrationsHistory
MigrationsHistory estava vazio.
Corre
dotnet ef database update -c StudyContext --verbose
(- verbose apenas por diversão)
e pegou
Done.
fonte
Eu enfrentei o mesmo bug abaixo. Então eu consertei da seguinte maneira:
dotnet ef migrations list
dotnet ef migrations remove
4. Agora está bem. Tente adicionar novamente:
dotnet ef migrations add [new_dbo_name]
5. Por fim, tente atualizar novamente, de acordo com a lista de migração:
dotnet ef database update [First]
dotnet ef database update [Second]
dotnet ef database update [new_dbo_name]
Espero que seja útil para você. ^^
fonte
Você excluiu a pasta de migração e estava tentando executar o comando "update-database" no console do gerenciador de pacotes? se então
Apenas exclua manualmente todas as suas tabelas e execute se update-databse (os dados de seed cons serão excluídos)
fonte
Outra maneira de fazer isso é comentar tudo na classe inicial, entre os métodos Up e Down. Em seguida, execute update-database, após a execução do método seed ter sido bem-sucedido, execute update-database novamente. Talvez seja útil para alguns amigos.
fonte
Eu estava enfrentando o mesmo problema. Tentei a solução abaixo: 1. excluí o código de criação da tabela de Up () e o código relacionado do método Down () 2. Execute o comando update-database no Package Manager Consol
isso resolveu meu problema
fonte
Nota: fiz isso porque não tenho nada no meu banco de dados. No meu caso: 1. Removi uma migração pelo comando remove-migration no Package Manager Console 2. Banco de dados removido pelo painel 'SQL Server Object Explorer'> no banco de dados atual> clique com o botão direito do mouse> Remover 3. Migrado no Package Manager Console write Add -Migração e clique em Enter 4. A última atualização pelo comando update-database
fonte
Mesmo caso (sem DB e tabela MigrationHistory no servidor). Meus passos:
fonte
No banco de dados, consulte a tabela __MigrationHistory e copie [ContextKey].
Cole-o na ConextKey DbMigrationsConfiguration como abaixo
fonte
As etapas a seguir funcionaram para mim para o mesmo problema:
Cenário:
Eu estava tentando adicionar 2 novos campos ao meu modelo existente para a funcionalidade de e-mail. Os novos campos são "IsEmailVerified" e "ActivationCode"
Passos que eu segui:
1. Excluí arquivos de migração antigos na pasta "Migrações" que me impediram de fazer Update-Database 2.Reverti todas as minhas alterações recentes que fiz no modelo
3. Execute o comando abaixo:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Fonte de dados = DESKTOP \ SQLEXPRESS; Catálogo inicial = Personalizado; Persistir informações de segurança = True; ID do usuário = sa; senha = **** "
4. Excluiu o conteúdo dos métodos Up () e Down () do arquivo de migração e deixou os métodos vazios
5. Execute o comando abaixo:
Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
Depois de executar a etapa acima, o modelo e o banco de dados parecem sincronizados.
Agora, adicionei as novas propriedades no modelo
Execute o comando abaixo:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
Agora, o arquivo de migração contém apenas minhas alterações recentes, conforme abaixo:
Execute o comando abaixo: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
11.Agora atualizei com sucesso o banco de dados com colunas adicionais.
A tabela abaixo é atualizada após as mudanças recentes:
Tabela após a atualização da migração
fonte
No arquivo de migração, verifique o método void Up () de substituição pública . Pode ser que você esteja tentando criar um novo objeto db que já está no banco de dados. Portanto, você precisa eliminar este objeto / tabela antes da criação do objeto db. Apenas faça como abaixo
E agora execute sua migração
Update-Database -TargetMigration: "2016_YourMigration"
fonte