Расширение 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: предполагая, что все атрибуты для отношений один-ко-многим установлены правильно

Другие вопросы по тегам