Почему создается дополнительное поле Section_Id, EF, Code first?

99
16 февраля 2022, 02:10

Создаю класс Section

public class Section
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string ChiefId { get; set; }
    public virtual ApplicationUser Chief { get; set; }
    public virtual ICollection<ApplicationUser> Staff { get; set; }
}

Есть стандартный класс ApplicationUser

public class ApplicationUser : IdentityUser
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public int? SectionId { get; set; }
    [ForeignKey("SectionId")] <<<<<<<<<< добавлено, но не помогает
    public virtual Section Section { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Обратите внимание, что authenticationType должен совпадать с типом, определенным в CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Здесь добавьте утверждения пользователя
        return userIdentity;
    }
}

Добавляю контекст

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public virtual DbSet<Section> Sections { get; set; }
    * * *

Почему в БД создается дополнительное поле Section_Id с нулевым значением (на рисунке показано создание ключа - закомментированное значение)?

А при удалении его из БД бросается исключение в контроллере

И есть ли способ избавиться от этого дополнительного поля?

Answer 1

В Entity framework для того чтобы создать связь "один ко многим" необходимо описать ее в каждом классе, между которыми создается эта связь. В одном классе (один) - это наличие двух полей - обычного и навигационного. (см. код ниже)

public class ApplicationUser : IdentityUser
{
    *  *  *
    public int? SectionId { get; set; }
    public virtual Section Section { get; set; }
    *  *  *

а другой класс (многие) должен также содержать реализацию этой связи - коллекцию

public class Section
{
    *  *  *
    public virtual ICollection<ApplicationUser> Staff { get; set; }
}

В вопросе описана одна такая связь (SectionId,Section => Staff), в то время как вторая не реализована до конца. Наличие с одной стороны пары свойств

public class Section
{
    *  *  *
    public string ChiefId { get; set; }
    public virtual ApplicationUser Chief { get; set; }
    *  *  *

требует реализации коллекции в классе ApplicationUser, например:

public class ApplicationUser : IdentityUser
{
    *  *  *
    public ICollection<Section> Sections { get; set; }
    *  *  *
READ ALSO
Как решить проблему с StackOverflow ecxeption?

Как решить проблему с StackOverflow ecxeption?

Есть рекурсивная функция

177
Как создать веб сокет клиент на C#?

Как создать веб сокет клиент на C#?

У меня есть сервер на php и webSocket клиент на js в браузереКак создать сокет соединения с этим же сервером на C# через протокол tcp? Использую стандартную...

155
Соединение проекта в Visual Studio с базой данных MS SQL Server

Соединение проекта в Visual Studio с базой данных MS SQL Server

Есть некоторое имя сервера SQL Server, например DESKTOP-1TUВ своем проекте в VS в файле App

135
Реализация сложных углов рамки

Реализация сложных углов рамки

Подскажите, пожалуйста, как правильно реализовать подобную рамку? Интересует именно форма углов, это можно сделать сделать на чистом CSS?

96