Чтобы описать, что я хочу: предположим, у меня есть таблица User
в SQL Server, которая содержит поле первичного ключа и два поля, которые ссылаются на одну и ту же таблицу с использованием внешних ключей.
CREATE TABLE [User] (
ID INT IDENTITY(1, 1) NOT NULL,
-- other properties omitted for brevity
CreatedByUserID INT NOT NULL,
LastModifiedByUserID INT NOT NULL,
CONSTRAINT PK_User PRIMARY KEY (ID),
CONSTRAINT FK_User_CreatedByUser FOREIGN KEY (CreatedByUserID) REFERENCES User
(ID),
CONSTRAINT FK_User_LastModifiedByUser FOREIGN KEY (LastModifiedByUserID) REFERENCES User (ID),
)
Я могу настроить пользователя «root», выполнив следующий SQL:
INSERT [User] (CreatedByUserID, LastModifiedByUserID) VALUES (1, 1)
SQL Server не выдает никаких ошибок.
Теперь, если я попытаюсь создать ту же таблицу, используяКод Entity Framework Во-первых, я получаю смешанные результаты:
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[ForeignKey(nameof(CreatedByUser))]
public int CreatedByUserID { get; set; }
//[ForeignKey(nameof(ModifiedByUser))]
//public int ModifiedByUserID { get; set; }
public virtual User CreatedByUser { get; set; }
//public virtual User ModifiedByUser { get; set; }
}
Это работает, как показано, но когда я раскомментирую строки ModifiedByUser *, я получаю различные ошибки «Кратность не действует в роли».
Я пытался преобразовать свой класс, основанный на аннотациях, в конфигурацию в свободном стиле, но мне не повезло, когда я запускаю Add-Migration
: всегда есть какая-то ошибка, которая возникает для некоторой комбинации методов конфигурации, и я никогдакажется, можно указать имена столбцов CreatedByUserID
или LastModifiedByUserID
.
user.HasRequired(x => x.CreatedBy);
//.WithRequiredPrincipal();
user.HasRequired(x => x.LastModifiedBy);
//.WithRequiredPrincipal();
Пытаюсь ли я сделать что-то, что запрещено Entity Framework?Или я пропустил одну или две строки конфигурации?Как я могу использовать EF для воссоздания структуры таблицы, показанной в верхней части этого поста?
РЕДАКТИРОВАТЬ: Этот же шаблон прекрасно работает для ряда других объектов в модели: например,WorkItem
может иметь как CreatedByUser
, так и ModifiedByUser
;проблема возникает только тогда, когда внешние ключи ссылаются на сущность того же типа, что и их вмещающий тип.