Расширение SQLite для xamarin.forms: удаление на каскаде не работает, но код компилируется без ошибок
Я использую SQLiteNetExtensions для создания внешнего ключа из одной таблицы в другую, чтобы я мог удалить на каскаде. Я следовал за документацией по адресу: https://bitbucket.org/twincoders/sqlite-net-extensions,
но когда я удаляю запись в моей таблице миссий, записи в моей таблице местоположений, которые ссылаются на этот первичный ключ, не удаляются,
я что-то пропустил?
Это мои таблицы:
using SQLiteNetExtensions.Attributes;
public class Locations
{
[PrimaryKey, AutoIncrement]
public int locationId { get; set; }
[ForeignKey(typeof(Missions))]
public int missionId { get; set; }
}
а также:
using SQLiteNetExtensions.Attributes;
public class Missions
{
[PrimaryKey, AutoIncrement]
public int missionId { get; set; }
public String missionName { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.CascadeDelete)]
public List<Locations> Locations { get; set; }
}
Также этот метод удаления используется для удаления записей из таблицы миссий:
public Task<int> DeleteMyMissionAsync(Missions myMission)
{
return database.DeleteAsync(myMission);
}
Есть ли способ проверить, что делают эти атрибуты из расширения SQLite? мой код компилируется и запускается, поэтому я не знаю, в чем ошибка.
Я попытался также добавить "использование SQLiteNetExtensionsAsync", но это не имело никакого значения.
РЕДАКТИРОВАТЬ: изменил мой метод удаления на:
public Task DeleteMyMissionAsync(Models.MyCreatedMissions myMission)
{
return database.DeleteAsync(myMission, recursive: true);
}
он запускается, но когда я удаляю запись в таблице Missions, на которую ссылается моя таблица Locations, он удаляет только эту запись и все записи в таблице Locations, которые ссылаются на эту запись, все еще существуют.
есть идеи?
0 ответов
Я использовал одноэлементный экземпляр SQLiteAsyncConnection в Xamarin.Forms, но в любом случае должен был вызвать "PRAGMA foreign_keys=ON;" перед каждым вызовом DeleteAsync. Вызов один раз после открытия соединения у меня не работал. Нет необходимости в библиотеке SQLiteNetExtensions для решения "проблемы" КАСКАДНОГО УДАЛЕНИЯ
Он работает, убедитесь, что объект, который вы передаете в функцию SQLiteNetExtensions.Extensions.WriteOperations.DeleteAll(..), имеет все присутствующие в нем дочерние объекты.
Звонок должен быть таким
SQLiteNetExtensions.Extensions.WriteOperations.DeleteAll(db, new Missions[] { missionsObj}, true);
В этих миссиях Obj.Locations не должны быть нулевыми и подсчитывать не ноль
Лучше, если вы сможете получить такие объекты миссий
SQLiteNetExtensions.Extensions.ReadOperations.GetAllWithChildren<Missions>(db, null, true);
поэтому он получит всех своих дочерних элементов, поэтому вы можете передать эти объекты миссии указанному выше методу удаления. и он должен работать
PS: предполагая, что все атрибуты для отношений один-ко-многим установлены правильно