Em uma relação Um-para-Um (1:1) no Entity Framework Core, o método .HasForeignKey precisa especificar qual classe contém a chave estrangeira física no banco de dados.
Um Exemplo
Assumindo que Empresa é a entidade principal e ela possui os IDs de Endereço e Contato:
modelBuilder.Entity<Empresa>(entity => {
// Relacionamento com Endereco
entity.HasOne(e => e.Endereco)
.WithOne(e => e.Empresa)
.HasForeignKey<Empresa>(e => e.EnderecoId) // <--- Especifique a classe aqui
.OnDelete(DeleteBehavior.NoAction);
// Relacionamento com Contato
entity.HasOne(e => e.Contato)
.WithOne(c => c.Empresa)
.HasForeignKey<Empresa>(e => e.ContatoId) // <--- Especifique a classe aqui
.OnDelete(DeleteBehavior.NoAction);
});
Por que isso é necessário?
Diferente de uma relação 1:N (onde a FK sempre fica no lado "N"), na relação 1:1 a chave estrangeira poderia estar em qualquer uma das duas tabelas.
Entidade Principal: É a que existe por si só (ex:
Empresa).Entidade Dependente: É a que contém a FK apontando para a principal (no seu caso, se o
EnderecoIdestá na tabela Empresa, aEmpresatecnicamente é a dependente doEndereco).
Dicas Importantes
Tipagem do ForeignKey: Se o
EnderecoIdestiver dentro da classeEmpresa, você usa.HasForeignKey<Empresa>(...). Se o ID da empresa estivesse lá na tabela de endereço, você usaria.HasForeignKey<Endereco>(...).Chave Única: O EF Core criará automaticamente um índice Unique para essas FKs, garantindo que um Endereço não seja usado por duas Empresas diferentes, mantendo a regra de 1:1.
Nullable: Se uma Empresa puder existir sem endereço, certifique-se de que a propriedade
EnderecoIdna sua classe seja opcional (int?ouGuid?).
Comentários