...Net Core - Error 42P07 en la migración existe base de datos pgSQL

votos
0

Tengo problemas para migrar a una base de datos existente,

Este es mi error:

Se produjo un error al iniciar la aplicación. PostgresException: 42P07: la relación Contaminacao ya existe Npgsql.NpgsqlConector <>c__DisplayClass161_0 <g__ReadMessageLong|0>d.MoveNext()

PostgresExcepción: 42P07: la relación Contaminacao ya existe

Imagen en VS2017: enter

El problema ocurre con la entidad Contaminacao y Contaminacao_Regra, donde Contaminacao_Regra tiene dos Contaminación fk. Miren:

Contaminacao

public class Contaminacao
    {
        public int Id { get; set; }
        [Required(ErrorMessage = Campo {0} é obrigatório)] // {0} é o campo Name
        [StringLength(8, MinimumLength = 4, ErrorMessage = O campo {0} deve ter entre {2} a {1} caracteres)]
        public string Cor { get; set; }
        [Display(Name = Descrição)]
        [StringLength(200, MinimumLength = 5, ErrorMessage = O campo {0} deve ter entre {2} a {1} caracteres)]
        public string Descricao { get; set; }

        public virtual ICollection<Contaminacao_Regra> Anterior_Contaminacao_Regras { get; set; } = new List<Contaminacao_Regra>();
        public virtual ICollection<Contaminacao_Regra> Proxima_Contaminacao_Regras { get; set; } = new List<Contaminacao_Regra>();

        public Contaminacao()
        {
        }

        public Contaminacao(int id, string cor, string descricao)
        {
            Id = id;
            Cor = cor;
            Descricao = descricao;
        }

        public Contaminacao(string cor, string descricao)
        {
            Cor = cor;
            Descricao = descricao;
        }
    }

Contaminacao_Regra

public class Contaminacao_Regra
    {
        public int Id { get; set; }
        [StringLength(200, MinimumLength = 5, ErrorMessage = O campo {0} deve ter entre {2} a {1} caracteres)]
        [Display(Name = Descrição)]
        public string Descricao { get; set; }
        public int Anterior_ContaminacaoId { get; set; }
        public int Proxima_ContaminacaoId { get; set; }

        [Display(Name = Contaminação Antes)]
        [ForeignKey(Anterior_ContaminacaoId)]
        //[Required(ErrorMessage = Campo {0} é obrigatório)]
        public virtual Contaminacao Contaminacao_Anterior { get; set; }

        [Display(Name = Contaminação Depois)]
        [ForeignKey(Proxima_ContaminacaoId)]
        //[Required(ErrorMessage = Campo {0} é obrigatório)]
        public virtual Contaminacao Contaminacao_Proxima { get; set; }

        public Contaminacao_Regra()
        {
        }

        public Contaminacao_Regra(int id, string descricao, Contaminacao contaminacao_Anterior, Contaminacao contaminacao_Proxima)
        {
            Id = id;
            Descricao = descricao;
            Contaminacao_Anterior = contaminacao_Anterior;
            Contaminacao_Proxima = contaminacao_Proxima;
        }

        public Contaminacao_Regra(int id, Contaminacao contaminacao_Anterior, Contaminacao contaminacao_Proxima)
        {
            Id = id;
            Contaminacao_Anterior = contaminacao_Anterior;
            Contaminacao_Proxima = contaminacao_Proxima;
        }

        public Contaminacao_Regra(string descricao, Contaminacao contaminacao_Anterior, Contaminacao contaminacao_Proxima)
        {
            Descricao = descricao;
            Contaminacao_Anterior = contaminacao_Anterior;
            Contaminacao_Proxima = contaminacao_Proxima;
        }
    }

Como tengo que poner dos fk de la misma entidad, hice esta configuración:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //Regra de Contaminação
            modelBuilder.Entity<Contaminacao_Regra>()
                   .HasOne(m => m.Contaminacao_Anterior)
                   .WithMany(t => t.Anterior_Contaminacao_Regras)
                   .HasForeignKey(m => m.Anterior_ContaminacaoId)
                   .OnDelete(DeleteBehavior.Restrict);

            modelBuilder.Entity<Contaminacao_Regra>()
                   .HasOne(m => m.Contaminacao_Proxima)
                   .WithMany(t => t.Proxima_Contaminacao_Regras)
                   .HasForeignKey(m => m.Proxima_ContaminacaoId)
                   .OnDelete(DeleteBehavior.Restrict);

            //Transferencia Produto
            modelBuilder.Entity<TransferenciaProduto>()
                   .HasOne(m => m.EstoqueOrigem)
                   .WithMany(t => t.Origem_TransferenciaProduto)
                   .HasForeignKey(m => m.EstoqueOrigemId)
                   .OnDelete(DeleteBehavior.Restrict);

            modelBuilder.Entity<TransferenciaProduto>()
                   .HasOne(m => m.EstoqueDestino)
                   .WithMany(t => t.Destino_TransferenciaProduto)
                   .HasForeignKey(m => m.EstoqueDestinoId)
                   .OnDelete(DeleteBehavior.Restrict);

            //Ordem Produção
            modelBuilder.Entity<OrdemProducao>()
                   .HasOne(m => m.Sequencia)
                   .WithOne(i => i.OrdemProducao)
                   .HasForeignKey<OrdemProducao_Sequencia>(b => b.OrdemProducaoId);

            // retira delete cascata
            var cascadeFKs = modelBuilder.Model.GetEntityTypes()
                .SelectMany(t => t.GetForeignKeys())
                .Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade);

            foreach (var fk in cascadeFKs)
                fk.DeleteBehavior = DeleteBehavior.Restrict;

            base.OnModelCreating(modelBuilder);

        }

Después de hacer estos ajustes, tuve el error que mencioné anteriormente. Este mismo problema fue mencionado aquí, pero no me ayudó mucho.

Recordando que el error se produce sólo cuando el banco ya existe.

¿Alguien sabe cómo resolverlo?

Publicado el 18/05/2020 a las 19:52
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more