サブソニック3.0.0.4 MySQLのアクティブレコードテンプレートは、最後に挿入されたIDを返していません

StackOverflow https://stackoverflow.com/questions/4342607

質問

エラーを再現する手順:

テーブルパーソン(person_id int(11)null auto_increment、firstName varchar(20)デフォルトnull、lastName varchar(20)デフォルトnull、age int(11)デフォルト '0'、プライマリキー(person_id))エンジン= innodb auto_increment = 36デフォルトのcharset = latin1

insertingine person(firstname、lastname、age)values( 'myname'、null、null); select last_insert_id()as newid

    Person personObject = new Person();
    personObject.Firstname= "myname";
    personObject.Add();
    Response.Write(personObject.PersonId);

出力は「0」です

役に立ちましたか?

解決

これはバグではなく、列と表の命名規則を変更した場合に発生する可能性が高いエラーです - > pascalcase。デフォルトでは、列/テーブル名が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のインフレクタークラスを使用して次の名前を生成した後、亜音波コアに2つの主要な問題があります。

更新/挿入に必要なプロパティのリフレクションを変更する必要があります。

//from
item.GetType().GetProperty(tbl.PrimaryKey.Name);
//to
item.GetType().GetProperty(Inflector.ToPascalCase(tbl.PrimaryKey.Name));

挿入の例を実行する場合は、列名を元のプロパティに返す必要があります。

//from
GetColumn(key)
//to
GetColumn(Inflector.AddUnderscores(key))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top