Net Core - Erreur 42P07 dans la migration de la base de données pgSQL

voix
0

J'ai des difficultés à migrer vers une base de données existante,

C'est mon erreur :

Une erreur s'est produite lors du démarrage de l'application. PostgresException : 42P07 : la relation Contaminacao existe déjà Npgsql.NpgsqlConnector <>c__DisplayClass161_0 <g__ReadMessageLong|0>d.MoveNext()

PostgresException : 42P07 : la relation Contaminacao existe déjà

Image dans VS2017 : enter

Le problème se pose avec l'entité Contaminacao et Contaminacao_Regra, où Contaminacao_Regra a deux Contamination fk. Regardez :

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;
        }
    }

Comme je dois mettre deux fk de la même entité, j'ai fait cette configuration :

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);

        }

Après avoir fait ces réglages, j'ai eu l'erreur que j'ai mentionnée ci-dessus. Ce même problème a été mentionné ici, mais cela ne m'a pas beaucoup aidé.

Il faut se rappeler que l'erreur ne se produit que lorsque la banque existe déjà.

quelqu'un sait-il comment résoudre le problème ?

Créé 18/05/2020 à 19:52
source utilisateur
Dans d'autres langues...                            

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