Xamarin Sqlite Insert не возвращает последний идентификатор первичного ключа
У меня есть простое лицо:
[Table("History")]
public class History
{
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[Indexed(Name = "IDX_History", Order = 1, Unique = true)]
public int Prefix { get; set; }
[Indexed(Name = "IDX_History", Order = 2, Unique = true)]
public int Stem { get; set; }
[Indexed(Name = "IDX_History", Order = 3, Unique = true)]
public int Suffix { get; set; }
[Indexed(Name = "IDX_Favourite")]
public bool IsFavourite { get; set; }
public DateTime LastViewed { get; set; } = DateTime.Now;
}
Я пытаюсь сделать вставку, если она новая или получить последний вставленный идентификатор, если он уже существует:
public static int SaveSolutionToHistory(Solution sol)
{
lock (_db)
{
var existingHistory = _db.Table<History>().FirstOrDefault(h => h.Prefix == sol.Prefix.Id
&& h.Stem == sol.Stem.Id
&& h.Suffix == sol.Suffix.Id);
if (existingHistory != null)
{
existingHistory.LastViewed = DateTime.Now;
_db.Update(existingHistory);
return existingHistory.Id;
}
_db.Insert(new History
{
Prefix = sol.Prefix.Id,
Stem = sol.Stem.Id,
Suffix = sol.Suffix.Id
});
return _db.ExecuteScalar<int>("SELECT last_insert_rowid()");
}
}
Верхняя часть прекрасно работает при возврате идентификатора для существующих записей, но по какой-то причине код вставки всегда возвращает 1, когда он должен вернуть последний вставленный основной идентификатор автоинкремента (как упомянуто в комментарии XML-методов):
_db.Insert(new History
{
Prefix = sol.Prefix.Id,
Stem = sol.Stem.Id,
Suffix = sol.Suffix.Id
});
И это возвращает правильный идентификатор:
return _db.ExecuteScalar<int>("SELECT last_insert_rowid()");
Мне кажется неэффективным делать два хита как это или делать это не строго типизировано. Есть ли причина, почему _db.Insert
не возвращает правильный идентификатор?
Я использую VS 2015, с HAXM и Marshmallow x86_64 Google API Image.
2 ответа
У меня была та же проблема, только что нашел ответ здесь, полный комментарий XML:
//
// Summary:
// /// Inserts the given object and retrieves its /// auto incremented primary key
// if it has one. ///
//
// Parameters:
// obj:
// /// The object to insert. ///
//
// Returns:
// /// The number of rows added to the table. ///
Под "извлечением" подразумевается, что сводка обновляет значение поля PK в объекте, который вы передали ему, поэтому, если вы хотите последний вставленный идентификатор, вы можете использовать это
Вы можете вставить строки в базу данных, используя Вставить. Если таблица содержит первичный ключ с автоинкрементом, то значение для этого ключа будет доступно после вставки:
public static void AddStock (SQLiteConnection db, string symbol) {
var s = new Stock { Symbol = symbol };
db.Insert (s);
Console.WriteLine ("{0} == {1}", s.Symbol, s.Id);
}
Это означает, что идентификатор будет доступен в поле идентификатора объекта.