Subsonic 3.0.0.4 modelli record attivo per MySQL non tornano ultima inserita id
-
30-09-2019 - |
Domanda
I passaggi per riprodurre l'errore:
CREATE TABLE persona ( person_id int (11) NOT NULL AUTO_INCREMENT, varchar cognome (20) DI DEFAULT NULL, varchar cognome (20) DI DEFAULT NULL, età int (11) DEFAULT '0', PRIMARY KEY (person_id)) ENGINE = InnoDB AUTO_INCREMENT = 36 default charset = latin1
INSERT INTO persona (nome, cognome, età) VALORI ( 'myname', null, null); SELEZIONE LAST_INSERT_ID () come newid
Person personObject = new Person();
personObject.Firstname= "myname";
personObject.Add();
Response.Write(personObject.PersonId);
uscita è "0'
Soluzione
Questo non è un bug, ma piuttosto un errore che è probabile che accada se si modifica la convenzione di denominazione di colonne e tabelle -> ToPascalCase. Per impostazione predefinita, un nome di colonna / tabella viene copiato il modo in cui viene definito il database MySQL. Il che rende questa brutta ??p>
Original
person personObject = new person()
personObject .person_id = 1;
personObject .first_name = "hello";
personObject .Save();
Quello che mi piace accada
Person personObject = new Person()
personObject.PersonId = 1;
personObject.FirstName = "hello";
personObject.Save();
Ci saranno due (~ 3, non ricordo ora) grandi temi al nucleo SubSonic dopo aver cambiato il modello predefinito per generare i seguenti nomi utilizzando la classe di inflettore SubSonic.
riflessione per le proprietà che sono necessari per gli aggiornamenti / INSERTI deve essere cambiato Esempio:
//from
item.GetType().GetProperty(tbl.PrimaryKey.Name);
//to
item.GetType().GetProperty(Inflector.ToPascalCase(tbl.PrimaryKey.Name));
i nomi di colonna dovrebbe essere restituito alla sua proprietà originale quando si fa inserti Esempio:
//from
GetColumn(key)
//to
GetColumn(Inflector.AddUnderscores(key))