Значение ключа foriegn внешней таблицы всегда показывает null ef core 3.1

#c# #entity-framework-core

#c# #entity-framework-core

Вопрос:

Почему мой внешний ключ Icollection всегда пуст У меня есть внешняя таблица с именем photos, которую я создал с помощью Icollection. Я использую ef core 3.1.7 и asp.net ядро 3.1 как заставить вложения файлов VesselsId не быть нулевым

В принципе, в одном сосуде может быть много фотографий, но их также может быть много сосудов.

  public class Vessels  {
    public int Id { get; set; }
    [StringLength(400)]
    public string Name { get; set; }
    public string FlagName { get; set; }
    public ICollection<FileAttachments> PhotosAttachments { get; set; }

}
  

Это вложения файлов

 public  class FileAttachments {
    public int Id { get; set; }
    public string Title { get; set; }
    public string File { set; get; }
}
  

В тех случаях, когда я хочу отобразить пустые фотографии, я использую оператор include, чтобы попытаться включить их в свой запрос.

   var vessels = await _context.Vessels.Where(w=>w.Id==id).Include(c=>c.PhotosAttachments).FirstAsync();
  
  

Но если я посмотрю здесь, он покажет, что PhotosAttachments имеют значение null, когда я смотрю на значение поля, достаточно уверенное, что оно находится там null.

введите описание изображения здесь

Я думаю, что мне нужно что-то здесь сделать, но я не уверен, что именно

 protected override void OnModelCreating(ModelBuilder modelBuilder) {
  base.OnModelCreating(modelBuilder);
}
  

Редактировать 2

В принципе, у меня есть общий метод загрузки файлов как таковой, который вызывается с помощью кнопки отправки

 [HttpPost]
public async Task<IActionResult> UploadFiles(List<IFormFile> FormFile, int UploadArea, int PoiId, int VesselId) {     

       FileAttachments attachments = new FileAttachments {
       DocumentPath = filePath,
       UploadAreaId = UploadArea,
       CaseId = resultCaseId,                        
       FullPath = savedFileName,
       FileSize = infoFile.Length,
       OrignalFileName = fileAttachments.FileName,
       FileAttachmentType = fileAttachmentType,
       TennantId = await GetCurrentTennantId(),
       Extension = infoFile.Extension.Replace(".", "").ToLower(),
       UploadedBy = caseOfficer.Id,
       CreatedDate = DateTime.Now,
       File = uniqueFilename,
       ContentType = fileAttachments.ContentType,
       isActive = true,
       isDeleted = false
    };
    if (PoiId != 0)  {
       attachments.PoiID= PoiId;
    }
    if (VesselId != 0) {
        attachments.VesselId = VesselId;                       
     }
     _context.Add(attachments);
    await _context.SaveChangesAsync();
}
  

Выше есть некоторая путаница, которую я использую для хранения чего-то другого
, коллекция не создает это поле, она создает VesselsId с
дополнительными s, это то, что не заполняется.

  public int? VesselId { get; set; }
  

Коллекция создает это поле

введите описание изображения здесь

Комментарии:

1. Можете ли вы поделиться кодом вставки для FileAttachments to Vessels ?

2. @MustafaArslan добавил код загрузки, показанный выше в правке 2. это обычный метод загрузки, это поле с именем uploadarea, которое я могу использовать, если мне нужно выполнить какой-то код, который отличается для фотографий судов, или проверить, что идентификатор судна не равен 0

3. @rogue39nin По-видимому, условный код attachments.VesselId = VesselId; не был выбран для ваших существующих данных, следовательно VesselId , количество вставленных записей в базе данных равно null .

4. Привет @IvanStoev это еще одно поле, которое я использую для хранения, оно должно храниться в [VesselsId] для корректной работы внешнего ключа, если вы посмотрите на снимок экрана базы данных. Если вы посмотрите на эту строку, у меня есть мое сообщение if вокруг поля [VesselId], которое сохраняется, его значение идентификатора сосуда, которое вызывает проблему, но когда я проверяю, что VesselsId отсутствует в модели привязки файлов, определяется icollection

5. Спасибо, что все заработало так, как должно @IvanStoev если вы разместите ответ, я отмечу миллион благодарностей.

Ответ №1:

Добавьте отношение к FileAttachments модели следующим образом

     public  class FileAttachments {
       ...
       [ForeignKey("Vessels")]
       public int? VesselId { get; set; }

       public Vessels Vessels { get; set; }
    }
  

Комментарии:

1. Привет, ты не сказал, куда добавить эту таблицу

2. Но почему бы не использовать ICollection это неправильный подход

3. Если я сделаю это с помощью вашего подхода, мне всегда будет нужен сосуд иногда это может быть poi с привязкой к файлу, а не к сосуду может быть прикреплено несколько объектов

4. Это не меняет вашу модель отношений. Это говорит VesselId о том, что это внешний ключ Vessels для EntityFramework. Это переопределяет соглашение EntityFramework по умолчанию. Соглашение по умолчанию — внешний ключ для Vessels модели is VesselsId .