Я использую SubSonic 2.2 и sqlite и столкнулся с проблемой при работе с таблицами со столбцом INTEGER PRIMARY KEY, который не является AUTOINCREMENT. Согласно faq :
Если вы объявляете столбец таблицы INTEGER PRIMARY KEY, то всякий раз, когда вы вставляете NULL в этот столбец таблицы, NULL автоматически преобразуется в целое число, которое на единицу больше, чем наибольшее значение этого столбца над все остальные строки таблицы или 1, если таблица пуста.
Таким образом, sqlite считает, что эти столбцы иногда автоматически увеличиваются (т. Е. Только когда предоставляются значения NULL). Проблема в том, что SubSonic считает, что они всегда с автоматическим приращением.
В моем приложении мои значения идентификаторов генерируются из удаленной базы данных, поэтому я не хочу автоматически генерировать их в sqlite. Это не должно быть проблемой: я просто предоставлю значения при создании записей в этой таблице. Однако, когда я использую файл sonic.exe от SubSonic для автоматической генерации моего DAL, для столбца первичного ключа устанавливается значение AutoIncrement = true. Похоже, это означает, что я не могу установить столбец идентификатора - ActiveHelper в subsonic. GetInsertCommand () игнорирует его, так как считает, что он генерируется автоматически.
Строка, в которой определяется, является ли она автоинкрементом или нет, находится в SubSonic.SQLiteDataProvider.GetTableSchema ():
column.AutoIncrement = Convert.ToBoolean(row["PRIMARY_KEY"]) && GetDbType(row["DATA_TYPE"].ToString()) == DbType.Int64;
Полагаю, решение может быть либо
Не использовать столбцы INTEGER PRIMARY KEY для ключей, сгенерированных в другом месте, или
Измените шаблоны, чтобы для столбцов такого типа не было установлено значение AutoIncrement = true. Это означало бы, что SubSonic никогда не будет рассматривать их как автоинкремент, поэтому я должен быть осторожен, чтобы потом не ожидать получения автоматически сгенерированных значений. К сожалению, я не думаю, что в шаблонах можно легко определить, действительно ли столбец имеет значение AUTOINCREMENT или нет, поэтому, возможно, мне придется вместо этого сделать некрасивое жесткое кодирование ....
Есть еще мысли или предложения?