Каскад при удалении не каскадный с EF - PullRequest
4 голосов
/ 06 октября 2011

У меня есть простая база данных sqlite с двумя таблицами.Когда я вручную удаляю (используя SQLite Expert) запись в таблице DataSets, соответствующая запись в OneD удаляется, как и ожидалось.Когда я удаляю запись в DataSets из Entity Framework, это не приводит к удалению записи поддержки ядра в One D.Ошибка не генерируется.

Есть идеи почему?

С уважением

Вот определение базы данных:

CREATE TABLE [DataSets] (
  [DataSetId] INTEGER NOT NULL ON CONFLICT FAIL PRIMARY KEY AUTOINCREMENT, 
  [Description] TEXT(128));

CREATE TABLE [OneD] (
  [OneDId] INTEGER NOT NULL ON CONFLICT FAIL PRIMARY KEY ON CONFLICT ABORT AUTOINCREMENT, 
  [DataSetId] INTEGER NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT ABORT REFERENCES [DataSets]([DataSetId]) ON DELETE CASCADE, 
  [StockSheetLength] INTEGER NOT NULL ON CONFLICT FAIL);

Вот как я могу удалитьзапись от EF

        var dataSets = from ds in context.DataSets select ds;
        foreach (var ds in dataSets)
            context.DataSets.DeleteObject(ds);

        context.SaveChanges();
        return true;

Ответы [ 3 ]

10 голосов
/ 09 декабря 2013

Проблема может быть решена включением внешних ключей в строке подключения:

data source=mydb.db;foreign keys=true
7 голосов
/ 14 апреля 2012

вот мое решение этой проблемы:

db.Connection.StateChange += ConnectionStateChange;

void ConnectionStateChange(object sender, System.Data.StateChangeEventArgs e)
{
    if (e.CurrentState == System.Data.ConnectionState.Open) 
         db.ExecuteStoreCommand("PRAGMA foreign_keys = true;");            
}
6 голосов
/ 06 октября 2011

Из документации SQLite: http://www.sqlite.org/foreignkeys.html

Ограничения внешнего ключа по умолчанию отключены (для обратной совместимости), поэтому должны включаться отдельно для каждого соединения с базой данных отдельно.

Может ли это быть вашей проблемой?Я не знаю, включает ли ваша Entity Framework по умолчанию:

  sqlite> PRAGMA foreign_keys = ON;

Редактировать: Глядя немного дальше, я наткнулся на это: http://nitoprograms.blogspot.com/2010_06_01_archive.html

Entity Framework на самом деле является поставщиком данных ADO.NET, который сам включает в себя поставщик данных ADO.NET (точнее, SQLite).Обычно Entity Framework открывает соединение с базой данных всякий раз, когда это необходимо;эти автоматически открытые соединения автоматически закрываются, когда Entity Framework завершает работу с ним.Это поведение по умолчанию хорошо работает с SQL Server из-за пула соединений его провайдера ADO.NET.Однако он не очень хорошо работает с SQLite из-за различных «свойств», существующих в самом соединении SQLite.Одним из примеров является «PRAGMA foreign_keys = ON», который применяет внешние ключи только для этого соединения с базой данных SQLite.Если Entity Framework открывает и закрывает свои соединения по желанию, то такие PRAGMA SQLite теряются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...