Я использую Entity Framework (.NET 4.0) с SQLite в качестве базовой базы данных и получаю исключение при попытке зафиксировать некоторые изменения в базе данных:
Ошибка основного поставщикапри фиксации.
Трассировка стека:
System.Data.EntityException: The underlying provider failed on Commit. ---> System.Data.SQLite.SQLiteException: The database file is locked
database is locked
at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavi
or behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
at System.Data.SQLite.SQLiteTransaction.Commit()
at System.Data.EntityClient.EntityTransaction.Commit()
--- End of inner exception stack trace ---
at System.Data.EntityClient.EntityTransaction.Commit()
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at MySystem.MySystemService.UpdateFollowersAndUsers() in C:\Path\To\MySystem\MySystemService.cs:line 295
Мой код довольно прост:
// Gets more followers for the competitor and updates the database
List<Follower> moreFollowers = GetMoreFollowers(competitor);
// Add the new followers to the database
using (MySystemEntities db = new MySystemEntities())
{
try
{
foreach (Follower f in moreFollowers)
{
db.AddToFollowers(f);
}
db.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
Этот фрагмент кода находится внутри MyService
Он приходит с группой из 5000 подписчиков и получает вышеуказанное исключение.Однако, когда я извлекаю тот же фрагмент кода в функцию Main
и просто вручную добавляю несколько подписчиков, он больше не выдает исключение, и подписчики успешно добавляются в мою базу данных. Очевидно, файл базы данных заблокирован, что может быть причиной этой проблемы?