Asp.net mvc .Net Core-迁移存在数据库pgSQL中出现错误42P07
我在迁移到现有数据库时遇到问题 这是我的错误: 启动应用程序时出错。性别歧视: 42P07:关系“aco”已存在 Npgsql.NpgsqlConnector+c_uuudisplayClass161_0+d.MoveNext() PostgresException:42P07:关系“InclumateCao”已存在 VS2017中的图像: 实体“污染物”和“污染物”出现问题,其中“污染物”有两个“污染物”fk。看: ‘曹操’Asp.net mvc .Net Core-迁移存在数据库pgSQL中出现错误42P07,asp.net-mvc,postgresql,.net-core,Asp.net Mvc,Postgresql,.net Core,我在迁移到现有数据库时遇到问题 这是我的错误: 启动应用程序时出错。性别歧视: 42P07:关系“aco”已存在 Npgsql.NpgsqlConnector+c_uuudisplayClass161_0+d.MoveNext() PostgresException:42P07:关系“InclumateCao”已存在 VS2017中的图像: 实体“污染物”和“污染物”出现问题,其中“污染物”有两个“污染物”fk。看: ‘曹操’ public class 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;
}
}
由于我必须从同一实体放置两个fk,因此我进行了以下配置:
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);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//污染资源
modelBuilder.Entity()
.HasOne(m=>m
.有许多(t=>t.前牙合)
.HasForeignKey(m=>m.ForeignKey)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(m=>m.Proxima)
.有许多(t=>t.Proxima\u污染物)
.HasForeignKey(m=>m.Proxima\u id)
.OnDelete(DeleteBehavior.Restrict);
//普罗杜托酒店
modelBuilder.Entity()
.HasOne(m=>m.EstoqueOrigem)
.有许多(t=>t.Origem_TransferenciaProduto)
.HasForeignKey(m=>m.EstoQueorigeId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(m=>m.EstoqueDestino)
.有许多(t=>t.Destino_TransferenciaProduto)
.HasForeignKey(m=>m.EstoqueDestinoId)
.OnDelete(DeleteBehavior.Restrict);
//奥德姆·普罗杜昂
modelBuilder.Entity()
.HasOne(m=>m.Sequencia)
.有一个(i=>i.OrdemProducao)
.HasForeignKey(b=>b.OrdemProducaoId);
//视网膜
var cascadeFKs=modelBuilder.Model.GetEntityTypes()
.SelectMany(t=>t.GetForeignKeys())
.Where(fk=>!fk.isoownership&&fk.DeleteBehavior==DeleteBehavior.Cascade);
foreach(级联FKS中的var fk)
fk.DeleteBehavior=DeleteBehavior.Restrict;
基于模型创建(modelBuilder);
}
在我做了这些设置之后,我犯了上面提到的错误。同样的问题也提到过,但对我帮助不大
记住,只有当银行已经存在时,错误才会发生
有人知道怎么解决吗
更新
FK_IdCorAntes和FK_IdCorDepois是“污染物”的FK
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;
}
}