質問: 私は拡張機能(SqlMapperExtensions.cs)を使用しています。 簡単な挿入を行うとき: ``` db.Insert(student); ``` 私は例外があります: ``` Object of type 'System.Int32' cannot be converted to type 'System.Int16'. ``` **dbのId型はSmallIntです。 POCOのId型はShortです。** Catchブロックでブレークポイントを設定すると、データがdbに継続的に保持されていることがわかります。問題は、メソッドが戻って、POCOに作成された新しいIDを設定しようとするときです。 **POCOのId型をInt**に**変更する**と動作します。 これはバグですか?私は何が欠けていますか?
回答: これは~~バグの~~ようなものです。 SqlMapperExtensionsが使用している実際の挿入ステートメントは次のとおりです(行530付近)。 ``` var r = connection.Query("select @@IDENTITY id", transaction: transaction, commandTimeout: commandTimeout); int id = (int)r.First().id; // (1) if (keyProperties.Any()) keyProperties.First().SetValue(entityToInsert, id, null); // (2) return id; ``` アイデンティティがintであると予想されることがわかります(上記の(1)を参照)。そしてint値(上記の注(2)を参照)を使ってエンティティにプロパティを設定しようとします。 POCOのidentityプロパティがshortの場合、上記の例外がスローされます。 **編集** コメントに記載されているように、 Dapper.Contribは`[Key]`属性をサポートするようになりました。