Решение типа ошибки «System.String» для типа «System.Int32» ⇐ C#
-
Anonymous
Решение типа ошибки «System.String» для типа «System.Int32»
03.01.2024: Вопрос: У меня есть база данных Bibliotheek с таблицей dbo.boek со столбцами: Boek_ID (ключ) и Boek_Genre(nvarchar(max),not null).
Для Boek_Genre я тестировал SelectListItem и SelectList, чтобы использовать раскрывающийся список. Это прекрасно работает.
Теперь я хочу протестировать выпадающий список с помощью enum. Однако выдает ошибку : невозможно привести объект типа «System.String» к типу «System.Int32». Я не могу отладить, откуда именно это взялось. Кажется, что строка используется для целого числа (перечисления?), однако какое именно.
Ошибка относится к index.cshtml.cs (Boek = await _context.Boek.ToListAsync();)
Я использую базовые страницы Razor только для создания, редактирования, удаления и просмотра, а теперь пытаюсь научиться использовать перечисление для раскрывающегося списка. Я много читал о преобразовании перечисления (значение — int) в строку, но дело в том, что ошибка записывает строку в int error.
Может ли кто-нибудь подсказать мне, как решить эту проблему?
05.01.2024: Ответ С огромной помощью Ганса Кестинга мне удалось это сделать! Решением для преобразования строкового поля базы данных в значение перечисления и наоборот является добавление преобразований в DbContext. Ниже вы найдете утверждения, которые я использовал для этого. Хотя я заставил это работать, это определенно НЕ лучшая практика. Одна ошибка и ничего не получится. Но горжусь тем, что мне удалось это сделать.
пространство имен Bibliotheek.Datamodels { книга публичного класса { [Ключ] общественный ИНТ Boek_ID {получить; набор; } [Показать(Имя = "Жанр")] общественные жанры книг Boek_Genre {get; набор; } } } пространство имен Bibliotheek.Datamodels; общедоступное перечисление Boekgenres { [Display(Name = "Roman")] Roman = 1, [Display(Name="Триллер")] Триллер = 2 } @page @using Bibliotheek.Datamodels @model Bibliotheek.Pages.Boeken.CreateModel @{ ViewData["Название"] = "Создать"; } Создать Книга Вернуться к списку Получить инструкции @section Скрипты { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} } пространство имен Bibliotheek.Pages.Boeken { общедоступный класс IndexModel: PageModel { частная библиотека Bibliotheek.Data.BibliotheekContext только для чтения _context; общедоступная IndexModel (контекст Bibliotheek.Data.BibliotheekContext) { _context = контекст;} общественный IList Boek {get;set; } = по умолчанию!; общедоступная асинхронная задача OnGetAsync() { если (_context.Book != ноль) {Book = ожидайте _context.Boek.ToListAsync();} } } } Создание базы данных СОЗДАТЬ ТАБЛИЦУ [dbo].[Book] ( Boek_ID int IDENTITY(1,1) ПЕРВИЧНЫЙ КЛЮЧ, Boek_Genre nvarchar (макс.) НЕ NULL ) ИДТИ { открытый класс BibliotheekContext: DbContext { общедоступный BibliotheekContext (параметры DbContextOptions) : база (варианты) { } public DbSet Boek {get; набор; } = по умолчанию!; защищенное переопределение void OnModelCreating (ModelBuilder modelBuilder) { // Преобразование поля базы данных Boek_Genre в принадлежащее ему значение перечисления преобразователь var = новый ValueConverter( v => v.ToString(), v => (Boekgenres)Enum.Parse(typeof(Boekgenres), v)); // Преобразование значения перечисления в соответствующее поле базы данных Boek_Genre Модельстроитель .Entity() .Property(d => d.Book_Genre) .HasConversion(новый EnumToStringConverter()); } } }
03.01.2024: Вопрос: У меня есть база данных Bibliotheek с таблицей dbo.boek со столбцами: Boek_ID (ключ) и Boek_Genre(nvarchar(max),not null).
Для Boek_Genre я тестировал SelectListItem и SelectList, чтобы использовать раскрывающийся список. Это прекрасно работает.
Теперь я хочу протестировать выпадающий список с помощью enum. Однако выдает ошибку : невозможно привести объект типа «System.String» к типу «System.Int32». Я не могу отладить, откуда именно это взялось. Кажется, что строка используется для целого числа (перечисления?), однако какое именно.
Ошибка относится к index.cshtml.cs (Boek = await _context.Boek.ToListAsync();)
Я использую базовые страницы Razor только для создания, редактирования, удаления и просмотра, а теперь пытаюсь научиться использовать перечисление для раскрывающегося списка. Я много читал о преобразовании перечисления (значение — int) в строку, но дело в том, что ошибка записывает строку в int error.
Может ли кто-нибудь подсказать мне, как решить эту проблему?
05.01.2024: Ответ С огромной помощью Ганса Кестинга мне удалось это сделать! Решением для преобразования строкового поля базы данных в значение перечисления и наоборот является добавление преобразований в DbContext. Ниже вы найдете утверждения, которые я использовал для этого. Хотя я заставил это работать, это определенно НЕ лучшая практика. Одна ошибка и ничего не получится. Но горжусь тем, что мне удалось это сделать.
пространство имен Bibliotheek.Datamodels { книга публичного класса { [Ключ] общественный ИНТ Boek_ID {получить; набор; } [Показать(Имя = "Жанр")] общественные жанры книг Boek_Genre {get; набор; } } } пространство имен Bibliotheek.Datamodels; общедоступное перечисление Boekgenres { [Display(Name = "Roman")] Roman = 1, [Display(Name="Триллер")] Триллер = 2 } @page @using Bibliotheek.Datamodels @model Bibliotheek.Pages.Boeken.CreateModel @{ ViewData["Название"] = "Создать"; } Создать Книга Вернуться к списку Получить инструкции @section Скрипты { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} } пространство имен Bibliotheek.Pages.Boeken { общедоступный класс IndexModel: PageModel { частная библиотека Bibliotheek.Data.BibliotheekContext только для чтения _context; общедоступная IndexModel (контекст Bibliotheek.Data.BibliotheekContext) { _context = контекст;} общественный IList Boek {get;set; } = по умолчанию!; общедоступная асинхронная задача OnGetAsync() { если (_context.Book != ноль) {Book = ожидайте _context.Boek.ToListAsync();} } } } Создание базы данных СОЗДАТЬ ТАБЛИЦУ [dbo].[Book] ( Boek_ID int IDENTITY(1,1) ПЕРВИЧНЫЙ КЛЮЧ, Boek_Genre nvarchar (макс.) НЕ NULL ) ИДТИ { открытый класс BibliotheekContext: DbContext { общедоступный BibliotheekContext (параметры DbContextOptions) : база (варианты) { } public DbSet Boek {get; набор; } = по умолчанию!; защищенное переопределение void OnModelCreating (ModelBuilder modelBuilder) { // Преобразование поля базы данных Boek_Genre в принадлежащее ему значение перечисления преобразователь var = новый ValueConverter( v => v.ToString(), v => (Boekgenres)Enum.Parse(typeof(Boekgenres), v)); // Преобразование значения перечисления в соответствующее поле базы данных Boek_Genre Модельстроитель .Entity() .Property(d => d.Book_Genre) .HasConversion(новый EnumToStringConverter()); } } }
Мобильная версия