Projeto de cadastro MVC5 em EntityFramework, .net6, Visual Studio Community 2022 e SQLServer 2019.
Eu gostaria de entender a mecânica do que está ocorrendo ou onde eu devo estar errando.
Tenho as models PessoaModel.cs e EnderecoModel.cs. Quando não relacionadas armazenam normalmente os valores. O problema acontece após o relacionamento, quando vai salvar a informação no banco retorna a mensagem abaixo. Pessoa sava a informação no banco, mas endereço gera o erro de conflito de chave estrangeira
SqlException: A instrução INSERT conflitou com a restrição do FOREIGN KEY "FK_Enderecos_Pessoas_PessoaID". O conflito ocorreu no banco de dados "BancoEleitoresWeb", tabela "dbo.Pessoas", column 'Id'. A instrução foi finalizada.
Cheguei ao ponto de criar um campo para inserir a chave estrangeira manualmente, mas não importa, inserindo a chave manualmente ou automaticamente, a mensagem aparece.
Quando faço um insert into direto no banco funciona corretamente.
public class PessoaModel
{
public PessoaModel()
{
this.Enderecos = new HashSet<EnderecoModel>();
}
[Column("Id")]
[Display(Name = "Código")]
public int Id { get; set; }
[Column("Nome")]
[Display(Name = "Nome")]
public string? Nome { get; set; }
[Column("Psudonimo")]
[Display(Name = "Pseudonimo")]
public string? Pseudonimo { get; set; }
[Column("Cpf")]
[Display(Name = "CPF")]
public string? Cpf { get; set; }
[Column("Nascimento")]
[Display(Name = "Nascimento")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Nascimento { get; set; }
[Column("Filhos")]
[Display(Name = "Filhos")]
public string? Filhos { get; set; }
[Column("Sexo")]
[Display(Name = "Sexo")]
public string? Sexo { get; set; }
[Column("Endereco")]
[Display(Name = "Endereço")]
//public EnderecoModel? Enderecos { get; set; }
public virtual ICollection<EnderecoModel> Enderecos { get; set; }
}
public class EnderecoModel
{
[Column("Id")]
[Display(Name = "Código")]
public int Id { get; set; }
[Column("Logradouro")]
[Display(Name = "Logradouro")]
public string? Logradouro { get; set; }
[Column("Numero")]
[Display(Name = "Numero")]
public string? Numero { get; set; }
[Column("Complemento")]
[Display(Name = "Complemento")]
public string? Complemento { get; set; }
[Column("Bairro")]
[Display(Name = "Bairro")]
public string? Bairro { get; set; }
[Column("Cidade")]
[Display(Name = "Cidade")]
public string? Cidade { get; set; }
[Column("UF")]
[Display(Name = "UF")]
public string? UF { get; set; }
[Column("CEP")]
[Display(Name = "CEP")]
public string? CEP { get; set; }
public int PessoaID { get; set; }
public PessoaModel? PessoaModel { get; set; }
}
public class ContatoController : Controller
{
private readonly IPessoaRepositorio _pessoaRepositorio;
private readonly IEnderecoRepositorio _enderecoRepositorio;
public ContatoController(IPessoaRepositorio pessoaRepositorio,
IEnderecoRepositorio enderecoRepositorio)
{
_pessoaRepositorio = pessoaRepositorio;
_enderecoRepositorio = enderecoRepositorio;
}
public IActionResult Index()
{
return View();
}
public IActionResult Criar()
{
return View();
}
public IActionResult CriarEndereco()
{
return View();
}
public IActionResult Editar()
{
return View();
}
public IActionResult Detalhes()
{
return View();
}
public IActionResult ApagarConfirma()
{
return View();
}
[HttpPost]
public IActionResult Criar(PessoaModel pessoa)
{
_pessoaRepositorio.Adicionar(pessoa);
return RedirectToAction("Index");
}
[HttpPost]
public IActionResult CriarEndereco(EnderecoModel endereco)
{
_enderecoRepositorio.Adicionar(endereco);
return RedirectToAction("Index");
}
}
public interface IPessoaRepositorio
{
List<PessoaModel> BuscarTodos();
PessoaModel Adicionar(PessoaModel pessoa);
}
public class PessoaRepositorio : IPessoaRepositorio
{
private readonly BancoContexto _bancoContexto;
public PessoaRepositorio(BancoContexto bancoContexto)
{
_bancoContexto = bancoContexto;
}
public PessoaModel Adicionar(PessoaModel pessoa)
{
_bancoContexto.Pessoas.Add(pessoa);
_bancoContexto.SaveChanges();
return pessoa;
}
public List<PessoaModel> BuscarTodos()
{
return _bancoContexto.Pessoas.ToList();
}
}
public interface IEnderecoRepositorio
{
List<EnderecoModel> BuscarTodos();
EnderecoModel Adicionar(EnderecoModel endereco);
}
public class EnderecoRepositorio : IEnderecoRepositorio
{
private readonly BancoContexto _bancoContexto;
public EnderecoRepositorio(BancoContexto bancoContexto)
{
_bancoContexto = bancoContexto;
}
public EnderecoModel Adicionar(EnderecoModel endereco)
{
_bancoContexto.Enderecos.Add(endereco);
_bancoContexto.SaveChanges();
return endereco;
}
public List<EnderecoModel> BuscarTodos()
{
return _bancoContexto.Enderecos.ToList();
}
}
public class BancoContexto : DbContext
{
public BancoContexto(DbContextOptions<BancoContexto> options) : base(options) { }
public DbSet<PessoaModel> Pessoas { get; set; } = null!;
public DbSet<EnderecoModel> Enderecos { get; set; } = null!;
public DbSet<PessoaEndereco> PessoaEnderecos { get; set; } = null!;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<EnderecoModel>()
.HasOne( p => p.PessoaModel)
.WithMany(e => e.Enderecos)
.HasForeignKey(e => e.PessoaID);
}
}
@model EnderecoModel
@{
ViewData["Title"] = "Adicionar endereço";
}
<h1>Novo Endereço</h1>
<br />
<form asp-controller="Contato" asp-action="CriarEndereco" method="post">
<div>
<div class="row g-3" method="get" action=".">
<div class="col-sm-2">
<input asp-for="CEP" type="text" class="form-control" placeholder="CEP" name="cep" id="cep" size="10">
</div>
</div>
<br />
<div class="row g-3" method="get" action=".">
<div class="col-sm-6">
<input asp-for="Logradouro" type="text" class="form-control" placeholder="Logradouro" id="logradouro">
</div>
<div class="col-sm-2">
<input asp-for="Numero" type="text" class="form-control" placeholder="Número" id="numero">
</div>
<div class="col-sm-4">
<input asp-for="Complemento" type="text" class="form-control" placeholder="Complemento" id="complemento">
</div>
<div class="col-sm-4">
<input asp-for="Bairro" name="bairro" type="text" class="form-control" placeholder="Bairro" id="bairro">
</div>
<div class="col-sm-3">
<input asp-for="Cidade" name="cidade" type="text" class="form-control" placeholder="Cidade" id="cidade">
</div>
<div class="col-sm-2">
<input asp-for="UF" name="uf" type="text" class="form-control" placeholder="UF" id="uf">
</div>
<div class="col-sm-2">
<input asp-for="PessoaID" name="P" type="text" class="form-control" placeholder="UF" id="uf">
</div>
</div>
</div>
<br />
<div class="d-grid gap-2 col-6 mx-auto">
<button type="submit" class="btn btn-primary btn-block">Adicionar</button>
<a class="btn btn-secondary btn-block" asp-controller="Contato" asp-action="Index" role="button">Voltar</a>
</div>
Se tento inserir os dados direto no SQLServer funciona direitinho.