Проблема, яку я стикаюся, полягає у тому, що під час редагування моделі користувачем, якщо він додає/видаляє дочірні моделі, в результаті збереження моделі отримую неочікувані результати. Наприклад, якщо я редагую базову модель і додаю нові дочірні моделі, а потім додаю нові дочірні моделі до дочірніх моделей, не всі моделі будуть збережені правильно.
Чи правильно я складаю це? Ось мій код:
Моделі Entity Framework:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
//Unity Item може мати 0, 1 або більше UnityModels. Ці моделі спрощені та мають додаткові властивості, які видалені. public class EFModelUnityItem : BaseModel<EFModelUnityItem> { public int Id { get; set; } [Required] public string UnityItemName { get; set; } = string.Empty; public string GeneratedGuid { get; set; } = string.Empty; public ICollection<EFThreeDimensionalModel>? UnityModels { get; set; } } //EFThreeDimensionalModel може мати 0, 1 або більше Child3DModels. Однак дитина ніколи не матиме дітей. //якщо EFThreeDimensionalModel - це дитина, вона матиме батька //EFThreeDimensionalModel також може мати 0, 1 або більше ModelFiles public class EFThreeDimensionalModel : BaseModel<EFThreeDimensionalModel> { public int Id { get; set; } public string ModelName { get; set; } = string.Empty; public string GeneratedGuid { get; set; } = string.Empty; public EFModelUnityItem UnityItem { get; set; } public int UnityItemId { get; set; } public int? ParentModelId { get; set; } public EFThreeDimensionalModel? ParentThreeDimensionalModel { get; set; } public ICollection<EFThreeDimensionalModel>? Child3DModels { get; set; } public ICollection<UnityItemModelFiles>? ModelFiles { get; set; } } public class UnityItemModelFiles : BaseModel<UnityItemModelFiles> { public int Id { get; set; } public string GeneratedGuid { get; set; } = string.Empty; public string ModelFileType { get; set; } = string.Empty; public string FileName { get; set; } = string.Empty; public string FileType { get; set; } = string.Empty; public string FileExtention { get; set; } = string.Empty; public EFThreeDimensionalModel? EFThreeDimensionalModel { get; set; } public int? EFThreeDimensionalModelId { get; set; } } // Відносини між сутностями modelBuilder.Entity<EFThreeDimensionalModel>() .HasMany(d => d.ModelFiles) .WithOne(d => d.EFThreeDimensionalModel) .HasForeignKey(d => d.EFThreeDimensionalModelId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity<EFThreeDimensionalModel>() .HasMany(p => p.Child3DModels) .WithOne(p => p.ParentThreeDimensionalModel) .HasForeignKey(p => p.ParentModelId); // База даних є часовою. Тому, коли вноситься оновлення, старий запис переносять до таблиці Історія, а новий запис додають. modelBuilder.Entity<EFModelUnityItem>().ToTable("EFModelUnityItem", c => c.IsTemporal()); modelBuilder.Entity<EFThreeDimensionalModel>().ToTable("EFThreeDimensionalModels", c => c.IsTemporal()); modelBuilder.Entity<UnityItemModelFiles>().ToTable("UnityItemModelFiles", c => c.IsTemporal()); |