Page 1 of 1

"SQLite Error - cannot start a transaction withing a transaction" with dotConnect Pro 4.6.226

Posted: Tue 14 May 2013 11:00
by bairog
Hello.
I'm using dotConnect for SQLite 4.6.226 Pro with Entity Framework Code-First (EF version is 5.0).
Code sample to run "as-is" (add reference to EntityFramework.dll (I use assembly v4.4.20627.0 for .NET 4.0), System.Data.Entity and System.ComponentModel.DataAnnotations to run this code):

Code: Select all

using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;


namespace EF_CodeFirst_SQLite
{
    class Program
    {
        static void Main(string[] args)
        {
            Database.DefaultConnectionFactory = new SQLiteConnectionFactory();

            var context = new BloggingContext("Data Source=D:\\DBSys.db; FailIfMissing=false;");
            var connection = ((IObjectContextAdapter) context).ObjectContext.Connection;
            connection.Open();

            using (DbTransaction transaction = context.Database.Connection.BeginTransaction())
            {
                context.Categories.Add(new SystemTypeCategoryDTO() { Id = 1, Name = "123" });
                context.SaveChanges();
                transaction.Commit();
            }
        }
    }

    public class SQLiteConnectionFactory : IDbConnectionFactory
    {
        private const string invariantName = "Devart.Data.SQLite";

        public DbConnection CreateConnection(string ConnectionString)
        {
            if (String.IsNullOrEmpty(ConnectionString))
                throw new ArgumentNullException("ConnectionString");

            DbProviderFactory sqliteProviderFactory = DbProviderFactories.GetFactory(invariantName);
            if (sqliteProviderFactory == null)
                throw new InvalidOperationException(String.Format("The '{0}' provider is not registered on the local machine.", invariantName));

            DbConnection connection = sqliteProviderFactory.CreateConnection();
            connection.ConnectionString = ConnectionString;

            return connection;
        }
    }

    public class SystemTypeCategoryDTO
    {
        [Key]
        public int Id { get; set; }
        [Required, MaxLength(50)]
        public String Name { get; set; }
    }

    class BloggingContext : DbContext
    {
        public BloggingContext(string connString)
            : base(connString)
        {
        }

        public DbSet<SystemTypeCategoryDTO> Categories { get; set; }
    }
}
At the line
context.SaveChanges()
I get Error
An error occured while starting a transaction on the provider connection.
SQLite Error \r\n cannot start a transaction withing a transaction
What could it be?

Re: "SQLite Error - cannot start a transaction withing a transaction" with dotConnect Pro 4.6.226

Posted: Sat 18 May 2013 07:33
by bairog
Please use

Code: Select all

using (DbTransaction transaction = connection.BeginTransaction())
instead of

Code: Select all

using (DbTransaction transaction = context.Database.Connection.BeginTransaction())
because ((IObjectContextAdapter)context).ObjectContext.Connection and context.Database.Connection are two different connections.

Notify us about the result.
Thx, its working now.