Mám potíže s migrací do existující databáze,
Toto je moje chyba:
Při spuštění aplikace došlo k chybě. PostgresException: 42P07: relace "Contaminacao" již existuje Npgsql.NpgsqlConnector <> c__DisplayClass161_0 <g__ReadMessageLong | 0> d.MoveNext ()
PostgresException: 42P07: vztah „Contaminacao“ již existuje
Problém nastává u entity Contaminacao a Contaminacao_Regra, kde Contaminacao_Regra má dvě kontaminace fk. Dívej se:
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;
}
}
Protože musím dát dva fk ze stejné entity, vytvořil jsem tuto konfiguraci:
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);
}
Po provedení těchto nastavení jsem měl výše uvedenou chybu. Stejný problém byl zmíněn zde , ale moc mi to nepomohlo.
Nezapomeňte, že k chybě dojde, pouze pokud již banka existuje.
ví někdo, jak to vyřešit ???