Entity Framework и внешние ключи той же таблицы - PullRequest
1 голос
/ 31 марта 2019

Чтобы описать, что я хочу: предположим, у меня есть таблица 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;проблема возникает только тогда, когда внешние ключи ссылаются на сущность того же типа, что и их вмещающий тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...