Já existe um objeto nomeado no banco de dados

115

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> 
Disse Roohullah Allem
fonte
Como posso fazer isso (mapeamento para design existente)?
Disse Roohullah Allem de
15
@HLGEM, Se um "banco de dados bem projetado" pode ser mapeado para um modelo de objeto usando EF, então o EF é capaz de gerá-lo também. As migrações de banco de dados são uma ferramenta poderosa que facilita a implantação de seu banco de dados. Eu não recomendaria evitar o uso de migrações de banco de dados. Caso contrário, os scripts de patch são necessários de qualquer maneira. Eu recomendaria usar as migrações de banco de dados direito.
Ilya Palkin

Respostas:

128

parece que há um problema no processo de migração, execute o comando add-migration em "Package Manager Console":

Adicionar-Migração inicial -IgnoreChanges

faça algumas alterações e, em seguida, atualize o banco de dados do arquivo "Inicial":

Update-Database -verbose

Editar: -IgnoreChanges está no EF6, mas não no EF Core, aqui está uma solução alternativa: https://stackoverflow.com/a/43687656/495455

Sina Amirshekari
fonte
8
O que isso exatamente faz? Isso permite que o novo modelo apenas substitua o antigo?
Travis Tubbs
1
Comecei a usar migrações manuais porque uso visualizações e tabelas em meu banco de dados. Cometi o erro de tentar usar migrações automáticas e, como resultado, estava tentando criar uma tabela a partir de uma visão. Nesse cenário, sua solução não funciona. Em vez disso, sempre devo usar migrações manuais. Então, depois de fazer isso, tive que desfazer as alterações no controle de origem e remover a entrada "Inicial" da tabela _Migrações.
arame3333
3
Isso apenas me leva a um loop infinito: o Console do gerenciador de pacotes não me deixa fazer Add-Migration porque apresenta um erro "Não é possível gerar uma migração explícita porque as seguintes migrações explícitas estão pendentes ..." ou seja, InitialCreate. Mas se eu não conseguir executar o banco de dados de atualização ATÉ que haja também algumas alterações de Ignore inicial, o que devo fazer ??
East of Nowhere
6
Add-Migration: Não foi encontrado um parâmetro que corresponda ao nome do parâmetro 'IgnoreChanges'.
Tzvi Gregory Kaidanov
3
@TravisTubbs isso ignora as mudanças que você fez e "finge" que seu modelo está sincronizado com o banco de dados, no que diz respeito à tabela de migração. Você ainda precisa sincronizar os dois manualmente; No meu caso, removi as alterações feitas no modelo, fiz uma Add-Migration, removi o conteúdo dos métodos up / down antes de fazer update-database - isso me retornou ao estado anterior à interrupção da migração. Então, eu realmente adicionei novamente as mudanças, fiz a migração de adição e atualização do banco de dados como de costume - desta vez tudo sincronizado
David Refaeli
73

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 chamada ContextKey.
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 da ContextKeycoluna em dbo.__MigrationHistorypara " EFDataAccess.Migrations.Configuration".
Em seguida, no lado do código, em Ferramentas => Console do gerenciador de pacotes, use o update-databasecomando.

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 para ContextKey, do que herdando MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>e deixando essa classe vazia. A última coisa a fazer é chamar Database.SetInitializer(new YourDbInitializer());seu DbContext em um construtor estático.

Espero que seu problema seja resolvido.

Elnaz
fonte
9
Incrível, tivemos exatamente esse problema!
Olivier ROMAND
3
Na verdade, esta é a verdadeira causa desse erro. EF está tentando criar o banco de dados porque não consegue ler quais migrações são aplicadas ao banco de dados por causa da diferença de nome
espaço
Obrigado essa resposta, me ajudou muito, como disse o Olivier ROMAND, eu tive exatamente esse problema!
Enrique A. Pinelo Novelo
Eu não tinha ideia que estava relacionado a isso, mas de alguma forma, mesmo remover os registros da MigrationHistorytabela 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.
Niklas
Esta é a resposta correta com detalhes, também é bom mencionar que às vezes um nome de pasta incorreto pode causar esse problema.
H35am
17

"Já existe um objeto chamado 'AboutUs' no banco de dados."

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 :

Migrações automáticas permitem que você use migrações do Code First sem ter um arquivo de código em seu projeto para cada alteração feita. Nem todas as alterações podem ser aplicadas automaticamente - por exemplo, renomeações de colunas exigem o uso de uma migração baseada em código.

Recomendação para ambientes de equipe

Você pode intercalar migrações automáticas e baseadas em código, mas isso não é recomendado em cenários de desenvolvimento de equipe. Se você faz parte de uma equipe de desenvolvedores que usa controle de origem, você deve usar migrações puramente automáticas ou migrações puramente baseadas em código. Dadas as limitações das migrações automáticas, recomendamos o uso de migrações baseadas em código em ambientes de equipe.

Ilya Palkin
fonte
12

No meu caso, minha EFMigrationsHistorymesa estava vazia (de alguma forma) e ao tentar correr update-databaseeu obteria:

Já existe um objeto chamado 'AspNetUsers' no banco de dados

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 EFMigrationsHistorytabela. 1 linha para cada migração que eu sabia que o banco de dados estava atualizado.

Uma linha terá 2 colunas: MigrationIdeProductVersion

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 digitando Get-Packageno Console do gerenciador de pacotes e procurando seu pacote ef.

Espero que isso seja útil para alguém.

Kolby
fonte
1
Como você preencheu a coluna Modelo?
Ciaran Gallagher de
7

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

dbo.__MigrationHistory

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.

O senador
fonte
5

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/

Ryan Layton
fonte
Essa resposta me levou ao meu erro, eu simplesmente tinha o projeto errado como projeto de inicialização.
Martin Johansson
Eu estava tendo um problema semelhante e isso resolveu para mim.
JordanTDN
3

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

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);
Arfa
fonte
Parece uma boa resposta, mas convém verificar a ortografia. Você também pode usar trechos de código para deixar claro que a última linha é o código. Envie-me uma mensagem se quiser ajuda com isso.
Mike Poole
Obrigado, como posso fazer uma massagem em você
arfa
1
Muito bem por adicionar o fragmento de código @arfa. Não há necessidade de massagem :). Se você gostaria de me enviar uma mensagem, basta digitar @seguido do meu nome de usuário na seção de comentários.
Mike Poole
3

Nota: solução não recomendada. mas solução rápida em alguns casos.

Para mim, o dbo._MigrationHistorybanco 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.

  1. Abra o painel 'SQL Server Object Explorer'> clique com o botão direito do mouse dbo._MigrationHistoryna tabela no banco de dados de origem (no meu caso, dev db)> Clique no menu "Comparação de dados ...".
  2. Em seguida, o assistente de comparação de dados apareceu, selecione o banco de dados de destino (no meu caso, banco de dados de produção) e clique em Avançar.
  3. Alguns segundos depois, ele mostrará alguns registros apenas no banco de dados de origem. basta clicar no botão 'Atualizar destino'.
  4. No navegador, clique no botão Atualizar e veja a mensagem de erro sumida.

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.

Youngjae
fonte
1
Isso funcionou para mim. No entanto, era o contrário. Meu banco de dados de produção tinha todos os registros em __EFMigrationHistory, enquanto aqueles no banco de dados dev estavam ausentes (exceto o inicial).
Jens Mander
1

Exclua linhas da tabela dbo_MigrationHistory ou exclua a tabela e execute

update-database -verbose

Ele executará todas as migrações em seu projeto, uma por uma

Ali Adravi
fonte
1

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:

  1. Faça uma atualização de porca, apenas inicie o aplicativo e chame VerifyCreated (). O banco de dados será criado / atualizado
  2. Comente ou remova o semeador.
Chekusty
fonte
1

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.

WickedW
fonte
1

O mesmo aconteceu comigo .. O problema foi que na verdade eu apaguei minha tabela do banco de dados MoviesCaste fiz uma nova tabela e o problema foi que minha última migração estava tentando induzir a tabela excluída MoviesCastno banco de dados. Resolvi simplesmente removendo todo o conteúdo da última migração e simplesmente executei o método Up () e down ()

public override void Up()
{
}

public override void Down()
{
}

em seguida, atualizou o banco de dados e simplesmente adicionou uma nova migração

Camaleão
fonte
1

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.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = Old_Namespace.Migrations.Configuration”;
}

Espero que isso ajude alguém em apuros.

Nathan
fonte
Eu tive uma situação semelhante após as mudanças de namespace. Tentei essa correção, mas ainda não funcionou. Portanto, modifiquei manualmente os namespaces na tabela do banco de dados e então começou a funcionar.
Kosist
0

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

Rasto
fonte
0

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.

FrankyHollywood
fonte
0

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:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

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.

JohnFI
fonte
0

Eu enfrentei o mesmo bug abaixo. Então eu consertei da seguinte maneira:

  1. Verifique os bancos de dados atuais em seu projeto:
    • dotnet ef migrations list
  2. Se o mais recente for o que você adicionou, remova-o:
    • dotnet ef migrations remove
  3. As saídas de garantia deste banco de dados devem ser detalhadas no código-fonte: arquivos .cs / .Designer.cs

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ê. ^^

Mai Nguyen
fonte
0

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)

Alok Singh
fonte
0

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.

iman mohadesi
fonte
0

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

Ashu_90
fonte
0

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

Erasyl Abenov
fonte
0

Mesmo caso (sem DB e tabela MigrationHistory no servidor). Meus passos:

  1. Excluí os dados de migração da seção Up and Down da minha primeira migração.
  2. Atualizar banco de dados com migração vazia (a tabela MigrationHistory foi criada)
  3. Adicione sua migração REAL e atualize o banco de dados com ela.
Vasiliy Terkin
fonte
0

No banco de dados, consulte a tabela __MigrationHistory e copie [ContextKey].

Cole-o na ConextKey DbMigrationsConfiguration como abaixo

internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
    {
        public DbConfiguration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "<contextKey from above>";
        }
Último Tribunal
fonte
0

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 = " ***

  1. Depois de executar a etapa acima, o modelo e o banco de dados parecem sincronizados.

  2. Agora, adicionei as novas propriedades no modelo

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. 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 = " ***

  1. Agora, o arquivo de migração contém apenas minhas alterações recentes, conforme abaixo:

       public override void Up()
         {
             AddColumn("dbo.UserAccounts", "IsEmailVerified", c => c.Boolean(nullable: false));
             AddColumn("dbo.UserAccounts", "ActivationCode", c => c.Guid(nullable: false));
         }        
         public override void Down()
         {
             DropColumn("dbo.UserAccounts", "ActivationCode");
             DropColumn("dbo.UserAccounts", "IsEmailVerified");
         }
  2. 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

Thamizh
fonte
-5

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

DropTable("dbo.ABC"); 
CreateTable(
            "dbo.ABC",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ..
                 }

E agora execute sua migração Update-Database -TargetMigration: "2016_YourMigration"

Mohammad Al-Hasan
fonte
6
Se você fizer isso, perderá todos os seus dados
Mehdiway