EF Core 3 проблемы с отношениями 1 к 0 - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь определить отношения, при которых у клиента может быть 0 или 1 адрес. Для этой связи мне нужен идентификатор клиента в таблице адресов, но мне не нужен идентификатор адреса в таблице клиентов. Звучит просто? Я просмотрел образцы, но в OnModelCreating отсутствуют некоторые свойства, такие как hasForeignKey или hasOptional, поэтому ни один из других образцов, которые я смотрел, не работал. Я использую EF Core версии 3.15. Независимо от того, что я пробую, миграция добавляет столбец addressId в таблицу Customer. Я хочу иметь возможность удалить все адреса с помощью оператора sql «удалить из адресов»

Вот мои 2 объекта

public class AddressEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid AddressId { get; set; }
    public string Line1 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
    public virtual Guid Customer { get; set; }
}

    public class CustomerEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid CustomerId { get; set; }
    public string CustomerName { get; set; }
    public string CustomerEmail { get; set; }
    public virtual AddressEntity Address { get; set; }
}

Вот мой код миграции

  protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Addresses",
            columns: table => new
            {
                AddressId = table.Column<Guid>(nullable: false),
                Line1 = table.Column<string>(nullable: true),
                City = table.Column<string>(nullable: true),
                State = table.Column<string>(nullable: true),
                PostalCode = table.Column<string>(nullable: true),
                Country = table.Column<string>(nullable: true),
                Customer = table.Column<Guid>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Addresses", x => x.AddressId);
            });

        migrationBuilder.CreateTable(
            name: "Customers",
            columns: table => new
            {
                CustomerId = table.Column<Guid>(nullable: false),
                CustomerName = table.Column<string>(nullable: true),
                CustomerEmail = table.Column<string>(nullable: true),
                AddressId = table.Column<Guid>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Customers", x => x.CustomerId);
                table.ForeignKey(
                    name: "FK_Customers_Addresses_AddressId",
                    column: x => x.AddressId,
                    principalTable: "Addresses",
                    principalColumn: "AddressId",
                    onDelete: ReferentialAction.Restrict);
            });

        migrationBuilder.CreateIndex(
            name: "IX_Customers_AddressId",
            table: "Customers",
            column: "AddressId");
    }

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Сначала напишите свои AddressEntity и CustomerEntity следующим образом:

public class AddressEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid CustomerId { get; set; }
    public string Line1 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }

    public CustomerEntity Customer { get; set; }
}

public class CustomerEntity
{
   [Key]
   [DatabaseGenerated(DatabaseGeneratedOption.None)]
   public Guid CustomerId { get; set; }
   public string CustomerName { get; set; }
   public string CustomerEmail { get; set; }

   public AddressEntity Address { get; set; }
}

Теперь в OnModelCreating следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<CustomerEntity>()
        .HasOne(c => c.Address)
        .WithOne(a => a.Customer)
        .HasForeignKey<AddressEntity>(a => a.CustomerId);
}

Теперь создайте новую миграцию , надеюсь, все будет сгенерировано как положено.

0 голосов
/ 17 июня 2020

Думаю, этот пример может решить вашу проблему.

https://anthonygiretti.com/2018/01/11/entity-framework-core-2-table-splitting/

...