Связь один к одному с другим первичным ключом в коде EF 6.1 сначала
У меня возникла проблема с получением ссылки на объект employee из объекта PayGroup с помощью Entity Framework 6.1. У меня есть внешний ключ в базе данных на PayGroup.SupervisorId - > Сотрудник.столбец EmployeeID. Обратите внимание, что это отношение равно нулю или один к одному (группа оплаты может иметь только одного руководителя, а сотрудник может быть только руководителем одной группы оплаты).
Согласно этой записи на GitHub , невозможно иметь внешний ключ на таблице с другим ключом. первичный ключ. Я добавил внешний ключ в базу данных вручную, но я не могу понять, как настроить отображение fluent api,чтобы иметь возможность получить объект 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 ответ:
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
будет зависимый).