Estou enfrentando um problema ao salvar entidades com o Entity Framework Core 6 (sem migrações, banco de dados SQL Server).
Mesmo com o mapeamento explícito de chaves estrangeiras, o EF Core tenta inserir uma coluna que não existe na tabela ( PecaIdPeca
), resultando em um erro de SQL.
Modelo:
public class OrcamentoPeca
{
[Key]
[Column("ID_OrcamentoPeca")]
public int IdOrcamentoPeca { get; set; }
[Column("ID_Orcamento")]
public int IdOrcamento { get; set; }
[Column("ID_Peca")]
public int IdPeca { get; set; }
[Column("Quantidade")]
public int Quantidade { get; set; }
// Propriedades de navegação (sem [ForeignKey] attribute)
public virtual Orcamento Orcamento { get; set; }
public virtual Peca Peca { get; set; }
}
Método de inserção:
[HttpPost]
public async Task<IActionResult> SalvarPecasSelecionadas(int IdOrcamento, List<int> PecasSelecionadas, Dictionary<int, int> Quantidades)
{
foreach (var pecaId in PecasSelecionadas)
{
var quantidade = Quantidades.ContainsKey(pecaId) ? Quantidades[pecaId] : 0;
if (quantidade > 0)
{
var orcamentoPeca = new OrcamentoPeca
{
IdOrcamento = IdOrcamento,
IdPeca = pecaId,
Quantidade = quantidade
};
_context.OrcamentoPeca.Add(orcamentoPeca);
var peca = _context.Pecas.FirstOrDefault(p => p.IdPeca == pecaId);
if (peca != null)
peca.Stock -= quantidade;
}
}
await _context.SaveChangesAsync();
return RedirectToAction("DetalhesOrcamento", new { id = IdOrcamento });
}
Contexto do banco de dados:
modelBuilder.Entity<OrcamentoPeca>(entity =>
{
entity.HasKey(e => e.IdOrcamentoPeca);
entity.ToTable("OrcamentoPeca");
entity.Property(e => e.IdOrcamentoPeca).HasColumnName("ID_OrcamentoPeca");
entity.Property(e => e.IdOrcamento).HasColumnName("ID_Orcamento");
entity.Property(e => e.IdPeca).HasColumnName("ID_Peca");
entity.Property(e => e.Quantidade).HasColumnName("Quantidade");
entity.HasOne(e => e.Orcamento)
.WithMany(o => o.OrcamentoPecas)
.HasForeignKey(e => e.IdOrcamento)
.OnDelete(DeleteBehavior.Cascade);
entity.HasOne(e => e.Peca)
.WithMany()
.HasForeignKey(e => e.IdPeca)
.OnDelete(DeleteBehavior.Cascade);
});
Erro:
SqlException: Nome de coluna inválido 'PecaIdPeca'. Microsoft.Data.SqlClient.SqlCommand+<>c.b__211_0(Resultado da tarefa)
DbUpdateException: Ocorreu um erro ao salvar as alterações da entidade. Consulte a exceção interna para obter detalhes.
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(conexão IRelationalConnection, token de cancelamento)
Código SQL gerado:
INSERT INTO [OrcamentoPeca] ([ID_Orcamento], [ID_Peca], [PecaIdPeca], [Quantidade])
OUTPUT INSERTED.[ID_OrcamentoPeca]
VALUES (@p0, @p1, @p2, @p3);
O mapeamento DbContext
está correto, a coluna PecaIdPeca
não existe no banco de dados, limpei e reconstruí o projeto.
Qualquer ajuda será apreciada.
Excluir a pasta migrations e os arquivos YourDbContextSnapshot.cs e reconstruir o projeto resolveria seu problema.