Ядро Entity Framework создает многозначный атрибут (список элементов внутри и сущность)

#c# #database #sqlite #entity-framework-core

#c# #База данных #sqlite #entity-framework-core

Вопрос:

Я разрабатываю WPF desktop application with Microsoft.EntityFrameworkCore.Sqlite , и у меня есть эта сущность Room , у которой есть многозначный атрибут NotAvailableTimes , который может быть множественным NotAvailableTimes для одной комнаты. Я пытался реализовать список, но, согласно моим исследованиям, EFCORE этого не поддерживает. Есть ли какой-нибудь простой способ реализовать это?

Я даже пытался создать другую сущность и добавить отношение «один ко многим» между двумя сущностями, но я не знаю, как вставить данные в список первой сущности.

Класс комнаты

 public class Room
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public String Rid { get; set; }
    public Building BuildingAS { get; set; }
    public String Type { get; set; }
    public int Capacity { get; set; }

    public IList<RoomNAT> RoomNATs { get; set; }

    public virtual ICollection<RoomLecturer> RoomLecturers { get; set; }
    public virtual ICollection<RoomSubject> RoomSubjects { get; set; }

}
  

мой класс-оболочка

 public class RoomNAT
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public String StartTime { get; set; }    
    public String EndTime { get; set; }    
    public String Day { get; set; }    
}
  

Ответ №1:

В основном такой же, как RoomLectures : сделайте его ICollection и пометьте его как виртуальный. Это действительно отношение «один ко многим».

 public virtual ICollection<RoomNATs> RoomNATs { get; set; }
  

После этого вам потребуется перенести / обновить базу данных, поскольку она сгенерирует таблицу, содержащую информацию.

Что касается этой части:

Я даже пытался создать другую сущность и добавить отношение «один ко многим» между двумя сущностями, но я не знаю, как вставить данные в список первой сущности.

Это также похоже на обычные вставки:

 _context.Rooms.RoomNATs.Add(new RoomNAT() { 
   //init properties
});

_context.SaveChanges();
  

Ответ №2:

Вы не можете сопоставить его в базе данных, если его виртуальное свойство не сделает его виртуальным, он должен работать нормально и сделать roomNats отдельной таблицей, а также добавить ограничение внешнего ключа.

  public class RoomNAT
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public String StartTime { get; set; }

    public String EndTime { get; set; }

    public String Day { get; set; }
    public virtual ICollection<Room> Rooms{ get; set; }
}

    public class Room
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public String Rid { get; set; }
    public Building BuildingAS { get; set; }
    public String Type { get; set; }
    public int Capacity { get; set; }

    public virtual RoomNAT RoomNATs { get; set; }

    public virtual ICollection<RoomLecturer> RoomLecturers { get; set; }
    public virtual ICollection<RoomSubject> RoomSubjects { get; set; }

}
  

Здесь отношение один ко многим
, если вы хотите, чтобы многие к одному или многие ко многим, вы можете изменить его на Ilist сейчас