#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
toVessels
?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
модели isVesselsId
.