Пользовательский столбец внешнего ключа исходной таблицы - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы настроить EFCore, чтобы свойство A класса B загружалось на основе свойства AAlternateId, а AAlteranateId должно быть внешним ключом таблицы A столбца AlternateId. Как мне настроить это с помощью свободного API?

class A {
  public Guid Id { get; set; }

  public Guid AlternateId { get; set; }
}

class B {
  public Guid Id { get; set; }

  public AAlternateId { get; set; }

  public A A { get; set; }
}

1 Ответ

0 голосов
/ 05 августа 2020

Сначала кажется, что вы забыли установить тип AAlternateId.

public Guid AAlternateId { get; set; }

Затем, если вы хотите, чтобы ForeignKey AAlternateId был связан с AlternateId (который не является PK), вы должны использовать PrincipalKey для определения ссылочного ключа AlternateId с уникальным ограничением .

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<A>().ToTable("A");
    modelBuilder.Entity<B>().ToTable("B");
    modelBuilder.Entity<B>()
        .HasOne(b => b.A)
        .WithOne()
        .HasPrincipalKey<A>(a => a.AlternateId)
        .HasForeignKey<B>(b => b.AAlternateId);
}

И результат:

CREATE TABLE [dbo].[B] (
[Id]           UNIQUEIDENTIFIER NOT NULL,
[AAlternateId] UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_B_A_AAlternateId] FOREIGN KEY ([AAlternateId]) REFERENCES [dbo].[A] ([AlternateId]) ON DELETE CASCADE
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...