1
resposta

Relacionamento Um para Um nao funciona no add-migration

Estou exatamente com o mesmo problema do Fabio Nunes, ele tem um topico ainda nao sulucionado mas nao consigo responder no mesmo topico, entao abri este novo.

Ao gerar a migration ele nao esta trazendo como deveria, a tabela endereco fica a principal e a cliente como dependente.

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");
        }
    }
1 resposta

Olá, Lucas

Adaptei para o seu problema um código que utilizei num dos nossos cursos. É um relacionamento com mapeamento fluente, onde um cliente possui um único endereço (um-para-um).

Veja se isso funciona para você:

public class ApplicationContext : DbContext
{
    public ApplicationContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Cliente>().HasKey(t => t.Id);
        modelBuilder.Entity<Cliente>().HasOne(t => t.EnderecoDeEntregaCliente).WithOne(t => t.Cliente).IsRequired();

        modelBuilder.Entity<Endereco>().HasKey(t => t.Id);
        modelBuilder.Entity<Endereco>().HasOne(t => t.Cliente);
    }
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software