Я использую 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.GetInsertCommand () subsonic игнорирует его, поскольку считает, что он создается автоматически.
Строка, в которой определяется, есть ли автоинкремент или нет, находится в SubSonic.SQLiteDataProvider.GetTableSchema ():
column.AutoIncrement = Convert.ToBoolean(row["PRIMARY_KEY"]) && GetDbType(row["DATA_TYPE"].ToString()) == DbType.Int64;
Думаю, решение - либо
Не использовать столбцы INTEGER PRIMARY KEY для ключей, сгенерированных в другом месте, или
Измените шаблоны так, чтобы для этих типов столбцов не было установлено значение AutoIncrement = true. Это означало бы, что SubSonic никогда не будет рассматривать их как автоматическое приращение, поэтому мне нужно быть осторожным, чтобы позже я не ожидал получить автоматически сгенерированные значения. К сожалению, я не думаю, что с помощью шаблонов можно легко определить, действительно ли столбец является AUTOINCREMENT или нет, поэтому, возможно, мне придется вместо этого сделать некрасивое жесткое кодирование ...
Есть другие мысли или предложения?