Subsoniques 3.0.0.4 modèles de disques actifs pour mysql non retour dernier id inséré
-
30-09-2019 - |
Question
Procédure pour reproduire l'erreur:
CREATE TABLE personne ( person_id int (11) NOT NULL AUTO_INCREMENT, prénom varchar (20) NULL DEFAULT, nom varchar (20) NULL DEFAULT, int d'âge (11) DEFAULT '0', la clé primaire (person_id)) MOTEUR = InnoDB AUTO_INCREMENT = 36 DEFAULT CHARSET = latin1
personne INSERT INTO (nom, prénom, âge) VALUES ( 'myname', NULL, NULL); SELECT LAST_INSERT_ID () comme newid
Person personObject = new Person();
personObject.Firstname= "myname";
personObject.Add();
Response.Write(personObject.PersonId);
sortie est "0'
La solution
Ce pas un bug mais une erreur qui est susceptible de se produire si vous modifiez la convention de nommage des colonnes et des tables -> ToPascalCase. Par défaut, un nom colonne / table est copié la façon dont il est défini sur la base de données MySQL. Ce qui rend cette vilaine
original
person personObject = new person()
personObject .person_id = 1;
personObject .first_name = "hello";
personObject .Save();
Ce que je veux arriver
Person personObject = new Person()
personObject.PersonId = 1;
personObject.FirstName = "hello";
personObject.Save();
Il y aura deux (~ 3, ne me souviens plus) les questions importantes au coeur SubSonic après avoir modifié le modèle par défaut pour générer les noms suivants en utilisant la classe inflector de subsonique.
réflexion pour les propriétés qui sont nécessaires pour MISES À JOUR / INSERTS doit être modifié exemple:
//from
item.GetType().GetProperty(tbl.PrimaryKey.Name);
//to
item.GetType().GetProperty(Inflector.ToPascalCase(tbl.PrimaryKey.Name));
les noms de colonnes doivent être retournés à sa propriété d'origine lors des insertions exemple:
//from
GetColumn(key)
//to
GetColumn(Inflector.AddUnderscores(key))