具有SQLite异常的实体框架:底层提供程序在Commit上失败

时间:2011-11-19 06:35:08

标签: c# entity-framework sqlite ado.net

我正在使用实体框架(.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内,它带有一批5,000个关注者,并且它获得了上述异常。但是,当我将相同的代码片段放入Main函数并只手动添加一些关注者时,它不再抛出异常并且关注者已成功添加到我的数据库中。 显然数据库文件已被锁定,可能导致此问题的原因是什么?

1 个答案:

答案 0 :(得分:1)

我刚刚在另一个问题中找到答案:'The database file is locked' with System.Data.SQLite

讽刺的是,OP也回答了他自己的问题:)。