Entity Framework new transaction is not allowed because there are other threads running in the session, multi thread save

andrea picture andrea · Mar 12, 2013 · Viewed 36.7k times · Source

I'm tryng to save on a DB the log of a multi thread processo but I'm getting the following error: new transaction is not allowed because there are other threads running in the session.

in each tread I have this function:

 internal bool WriteTrace(IResult result, string message, byte type)
    {
        SPC_SENDING_TRACE trace = new SPC_SENDING_TRACE(
                        message,
                        Parent.currentLine.CD_LINE,
                        type,
                        Parent.currentUser.FULLNAME,
                        Parent.guid);
        Context.SPC_SENDING_TRACE.AddObject(trace);
        if (Context.SaveChanges(result) == false)
            return false;
        return true;

    }

the Context is different for each thread, but the connection with the DB is always the same.

is there a way to solve this problem?

thank you Andrea

Answer

ecampver picture ecampver · Mar 12, 2013

You should create a context for each transaction and then dispose it, you can do that like this:

using(var ctx = new MyContext()) {
    //do transaction here
}

After the closed bracket the context is disposed.

For better understanding refer to this post where you can find a great answer by ken2k. Hope you can fix you issue :)

UPDATE:

You should also try adding .ToList() to every LINQ query you have. When you iterate over a LINQ result, you can't make any changes until the iteration has finished. Check if you have something like that or share more code i.e. the piece of code where you call WriteTrace. Hope that this time this actually helps you.