Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida Aula 07 Relacionamento Um para Um Classe Endereço como principal

Fala galera, Estou com o seguinte problema: Fiz os códigos conforme apresentados nas aulas, mas quando gero a migration a classe Endereco fica como tabela principal e a classe Cliente como tabela dependente. Já fiz e refiz o código e o problema persiste. Alguém mais teve esse problema?

6 respostas

Olá Josias,

esquisito, me manda as suas classes Endereco, Cliente e migration gerada para eu dar uma olhada o que ocorreu.

Fala Lucas! Seguem as classes abaixo:

Classe cliente

public class Cliente
    {
        public int Id { get; set; }
        public string Nome { get; internal set; }
        public Endereco EnderecoDeEntrega { get; set; }
    }

Classe endereço

public class Endereco
    {
        public int Numero { get; internal set; }
        public string Logradouro { get; internal set; }
        public string Complemento { get; internal set; }
        public string Bairro { get; internal set; }
        public string Cidade { get; internal set; }
        public Cliente Cliente { get; set; }
    }

Migration Cliente

public partial class Cliente : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Enderecos",
                columns: table => new
                {
                    ClienteId = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    Bairro = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Cidade = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Complemento = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Logradouro = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Numero = table.Column<int>(type: "int", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Enderecos", x => x.ClienteId);
                });

            migrationBuilder.CreateTable(
                name: "Clientes",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    EnderecoDeEntregaClienteId = table.Column<int>(type: "int", nullable: true),
                    Nome = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Clientes", x => x.Id);
                    table.ForeignKey(
                        name: "FK_Clientes_Enderecos_EnderecoDeEntregaClienteId",
                        column: x => x.EnderecoDeEntregaClienteId,
                        principalTable: "Enderecos",
                        principalColumn: "ClienteId",
                        onDelete: ReferentialAction.Restrict);
                });

            migrationBuilder.CreateIndex(
                name: "IX_Clientes_EnderecoDeEntregaClienteId",
                table: "Clientes",
                column: "EnderecoDeEntregaClienteId",
                unique: true,
                filter: "[EnderecoDeEntregaClienteId] IS NOT NULL");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Clientes");

            migrationBuilder.DropTable(
                name: "Enderecos");
        }
    }

Não sei o por que, mas a formatação da migration ficou bagunçada, espero que dê pra entender! Obrigado Lucas!

Olá Josias,

você chegou a configurar no Context indicando que o Endereco tem a chave ClienteId? Outra coisa é veja se removendo a última migration e gerando ela novamente ele não cria com o Endereço sendo o lado forte.

Sim Lucas, indiquei a chave ClienteId no Context para o Endereço. Exclui e gerei novamente a Migration, mas o Endereço ainda aparece como Entidade Forte e Cliente como fraca!

solução!

Ok, uma forma que podemos fazer para forçar o relacionamento é explicitando no Context. Você pode passar algo como:

        modelBuilder.Entity<Entidade forte>()
            .HasOne(forte => fote.PropriedadeParaEntidadeFraca)
            .WithOne(fraca => fraca.PropriedadeParaEntidadeForte)
            .HasForeignKey<Entidade fraca>("Coluna do relacionamento");

Veja se funciona forçando e qualquer coisa se não rolar me manda o seu Context para eu dar uma olhada.

Muito obrigado Lucas, agora deu certo! Só fica o mistério do por que o Entity não criou o relacionamento da forma que deveria?! kkk Um grande abraço!