Связь один к одному с другим первичным ключом в коде EF 6.1 сначала


У меня возникла проблема с получением ссылки на объект employee из объекта PayGroup с помощью Entity Framework 6.1. У меня есть внешний ключ в базе данных на PayGroup.SupervisorId - > Сотрудник.столбец EmployeeID. Обратите внимание, что это отношение равно нулю или один к одному (группа оплаты может иметь только одного руководителя, а сотрудник может быть только руководителем одной группы оплаты).

Согласно этой записи на GitHub , невозможно иметь внешний ключ на таблице с другим ключом. первичный ключ. Я добавил внешний ключ в базу данных вручную, но я не могу понять, как настроить отображение fluent api,чтобы иметь возможность получить объект employee из группы оплаты.

Таблица Групп Оплаты

Таблица Групп Выплат

Таблица Сотрудников

таблица Employee

Примечание: существует внешний ключ от PayGroup.Супервайзер-Сотрудник.EmployeeId в базе данных.

Ниже приведены DTO (в настоящее время у меня нет ни одного рабочего отображение отношений между этими классами):

public class PayGroup
{
    public int Id { get; set; }
    public string SupervisorId { get; set; }
    public virtual Employee Supervisor { get; set; }
}

public class Employee
{
    public string EmployeeId { get; set; }
    public string FullName { get; set; }
}
1 2

1 ответ:

one-to-one связь с явным свойством FK (например, ваш PayGroup.SupervisorId) не поддерживается.

Поэтому удалите это свойство из модели:

public class PayGroup
{
    public int Id { get; set; }
    public virtual Employee Supervisor { get; set; }
}

И использовать следующее свободное отображение:

modelBuilder.Entity<PayGroup>()
    .HasRequired(e => e.Supervisor)
    .WithOptional()
    .Map(m => m.MapKey("SupervisorId"));

Вызов WithOptional() указывает на две вещи. Во-первых, что в классе Employee нет обратного свойства навигации, а во-вторых, что FK является необязательным (Allow Nulls = true в таблице).

Если вы решите добавить свойство обратной навигации

public class Employee
{
    public string EmployeeId { get; set; }
    public string FullName { get; set; }
    public virtual PayGroup PayGroup { get; set; } // <=
}

Измените его на WithOptional(e => e.PayGroup).

Если вы хотите сделать его обязательным (Allow Nulls = false в таблице), а затем использовать соответствующую перегрузку WithRequiredDependent (зависимый здесь означает, что Employee будет основной и PayGroup будет зависимый).