Шаблоны активных записей Subsonic 3.0.0.4 для MySQL не возвращают последний вставленный идентификатор
-
30-09-2019 - |
Вопрос
Действия по воспроизведению ошибки:
Создать таблицу Person (person_id int (11) не null auto_increment, firstname varchar (20) null по умолчанию, lastname varchar (20) по умолчанию Null, возраст int (11) по умолчанию '0', первичный ключ (Person_id) ingine = innodb auto_increment = 36 по умолчанию charset = latin1
Вставьте в личность (FirstName, Lastname, Age) Values ('myName', null, nul
Person personObject = new Person();
personObject.Firstname= "myname";
personObject.Add();
Response.Write(personObject.PersonId);
вывод: «0»
Решение
Это не ошибка, а скорее ошибка, которая может произойти, если вы измените соглашение об именах столбцов и таблиц -> ToPascalCase.По умолчанию имя столбца/таблицы копируется так, как оно определено в базе данных MySQL.Что делает это уродливым
Оригинал
person personObject = new person()
personObject .person_id = 1;
personObject .first_name = "hello";
personObject .Save();
Что мне нравится, чтобы произошло
Person personObject = new Person()
personObject.PersonId = 1;
personObject.FirstName = "hello";
personObject.Save();
После изменения шаблона по умолчанию для генерации следующих имен с использованием класса инфлектора SubSonic возникнут две (~3, сейчас не помню) основные проблемы с ядром SubSonic.
Отражение для свойств, которые необходимы для обновлений/вставки должны быть изменены Пример:
//from
item.GetType().GetProperty(tbl.PrimaryKey.Name);
//to
item.GetType().GetProperty(Inflector.ToPascalCase(tbl.PrimaryKey.Name));
Имена столбцов должны быть возвращены в его исходное свойство при выполнении вставки Пример:
//from
GetColumn(key)
//to
GetColumn(Inflector.AddUnderscores(key))