使用 Entity Framework Core 6(没有迁移,SQL Server 数据库)保存实体时遇到问题。
即使使用外键的明确映射,EF Core 仍会尝试插入表中不存在的列(PecaIdPeca
),从而导致 SQL 错误。
模型:
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; }
}
插入方法:
[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 });
}
数据库上下文:
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);
});
错误:
SqlException:列名“PecaIdPeca”无效。Microsoft.Data.SqlClient.SqlCommand+<>c.b__211_0(任务结果)
DbUpdateException:保存实体更改时发生错误。有关详情,请参阅内部异常。
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection 连接,CancellationToken 取消令牌)
生成的SQL代码:
INSERT INTO [OrcamentoPeca] ([ID_Orcamento], [ID_Peca], [PecaIdPeca], [Quantidade])
OUTPUT INSERTED.[ID_OrcamentoPeca]
VALUES (@p0, @p1, @p2, @p3);
中的映射DbContext
是正确的,该列PecaIdPeca
在数据库中不存在,我已经清理并重建了该项目。
任何帮助都将不胜感激。