Exemplo n.º 1
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="DbAccessLayer" /> class.
        /// </summary>
        /// <param name="database">The database.</param>
        /// <param name="config">The configuration.</param>
        /// <exception cref="System.ArgumentNullException">database</exception>
        public DbAccessLayer(IDatabaseStrategy database, DbConfig config = null)
            : this(config)
        {
            if (database == null)
            {
                throw new ArgumentNullException(nameof(database));
            }

            DbAccessType = database.SourceDatabase;
            Database     = new DefaultDatabaseAccess(new InstanceConnectionController());
            Database.Attach(database);
            DatabaseStrategy = database;
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Create a DbAccessLayer that uses a Predefined type and Connection string
        /// </summary>
        public DbAccessLayer(DbAccessType dbAccessType, string connection, DbConfig config = null)
            : this(config)
        {
            if (dbAccessType == DbAccessType.Unknown)
            {
                throw new InvalidEnumArgumentException("dbAccessType", (int)DbAccessType.Unknown, typeof(DbAccessType));
            }

            DbAccessType = dbAccessType;
            Database     = new DefaultDatabaseAccess(new InstanceConnectionController());
            var database =
                GenerateStrategyFromExternal(ProviderCollection.FirstOrDefault(s => s.Key == dbAccessType).Value, connection);
            Database.Attach(database);
            DatabaseStrategy = database;
        }
Exemplo n.º 3
0
        /// <summary>
        ///     Create a DbAccessLAyer with exernal Strategy
        /// </summary>
        /// <exception cref="ArgumentNullException"></exception>
        public DbAccessLayer(string fullTypeNameToIDatabaseStrategy, string connection, DbConfig config = null)
            : this(config)
        {
            if (string.IsNullOrEmpty(fullTypeNameToIDatabaseStrategy))
            {
                throw new ArgumentNullException("fullTypeNameToIDatabaseStrategy");
            }

            ResolveDbType(fullTypeNameToIDatabaseStrategy);

            var database = GenerateStrategyFromExternal(fullTypeNameToIDatabaseStrategy, connection);

            Database = new DefaultDatabaseAccess(new InstanceConnectionController());
            Database.Attach(database);
            DatabaseStrategy = database;
        }
        public void NestedTransactionWithSharedInInstanceCounter()
        {
            //ThreadConnectionController.UseTransactionClass();
            var dbOne = new DefaultDatabaseAccess(new ThreadConnectionController());

            dbOne.Attach(new MsSql(DbAccess.Database.ConnectionString));
            var rootAccess = new DbAccessLayer(dbOne, DbAccess.Config);

            rootAccess.Database.RunInTransaction(d =>
            {
                Assert.That(() =>
                {
                    DbAccess.Database.RunInTransaction(dd =>
                    {
                        DbAccess.Select <Users>();
                    });
                }, Throws.Nothing);
            });
        }
Exemplo n.º 5
0
		/// <summary>
		///     Creates a Debugger that contains some debugging data
		/// </summary>
		internal QueryDebugger(IDbCommand command, IDatabase source)
		{
			Init();
			//Init async because this could be time consuming
			_loaded = false;

			var debugquery = new StringBuilder(command.CommandText);
			if (UseDefaultDatabase != null && source == null)
			{
				source = new DefaultDatabaseAccess();
				source.Attach(UseDefaultDatabase);
			}

			var formartCommandToQuery = source != null
				? source.FormartCommandToQuery(command)
				: GenericCommandToQuery(command);

			DebuggerQuery = debugquery.ToString();
			SqlQuery = formartCommandToQuery;
		}
        public void SharedTransactionCounter()
        {
            var dbOne = new DefaultDatabaseAccess(new ThreadConnectionController());

            dbOne.Attach(new MsSql(DbAccess.Database.ConnectionString));
            var rootAccess = new DbAccessLayer(dbOne, DbAccess.Config);

            Assert.That(rootAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(0));
            Assert.That(rootAccess.Database.ConnectionController.LockRoot, Is.Not.Null);
            Assert.That(rootAccess.Database.ConnectionController.Transaction, Is.Null);

            var dbTwo = new DefaultDatabaseAccess(new ThreadConnectionController());

            dbTwo.Attach(new MsSql(DbAccess.Database.ConnectionString));
            var nestedAccess = new DbAccessLayer(dbTwo, DbAccess.Config);

            Assert.That(nestedAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(0));
            Assert.That(nestedAccess.Database.ConnectionController.LockRoot, Is.EqualTo(dbOne.ConnectionController.LockRoot));
            Assert.That(nestedAccess.Database.ConnectionController.Transaction, Is.Null);

            Assert.That(DbAccess.Database.ConnectionController, Is.Not.EqualTo(dbOne.ConnectionController));
            Assert.That(DbAccess.Database.ConnectionController.LockRoot, Is.Not.EqualTo(dbOne.ConnectionController.LockRoot));

            Assert.That(rootAccess.Database, Is.Not.EqualTo(nestedAccess.Database));
            Assert.That(rootAccess.Database.ConnectionController, Is.Not.EqualTo(nestedAccess.Database.ConnectionController));

            if (Type.HasFlag(DbAccessType.MsSql))
            {
                DbAccess.ExecuteGenericCommand("ALTER DATABASE " + DbAccess.Database.DatabaseName +
                                               " SET ALLOW_SNAPSHOT_ISOLATION ON");
            }

            DbAccess.Database.RunInTransaction((de) =>
            {
                Assert.That(DbAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(1));
                Assert.That(DbAccess.Select <Users>().Length, Is.EqualTo(0));
            }, IsolationLevel.Snapshot);

            rootAccess.Database.RunInTransaction(d =>
            {
                Assert.That(rootAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(nestedAccess.Database.ConnectionController.InstanceCounter));
                Assert.That(rootAccess.Database.ConnectionController.Transaction, Is.EqualTo(nestedAccess.Database.ConnectionController.Transaction));
                Assert.That(rootAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(1));
                DataMigrationHelper.AddUsersFast(10, rootAccess);
                Assert.That(rootAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(1));

                //the nested database runs with the same TransactionCounter as the RootAccess so it should use
                //the same transaction and connection
                nestedAccess.Database.RunInTransaction((de) =>
                {
                    Assert.That(rootAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(2));
                    Assert.That(nestedAccess.Select <Users>().Length, Is.EqualTo(10));
                    DataMigrationHelper.AddUsersFast(10, nestedAccess);
                    Assert.That(rootAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(2));
                });

                Assert.That(nestedAccess.Select <Users>().Length, Is.EqualTo(20));

                DbAccess.Database.RunInTransaction((de) =>
                {
                    Assert.That(DbAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(1));
                    Assert.That(DbAccess.Select <Users>().Length, Is.EqualTo(0));
                }, IsolationLevel.Snapshot);
            }, IsolationLevel.Snapshot);
            DbAccess.Database.RunInTransaction((de) =>
            {
                Assert.That(DbAccess.Database.ConnectionController.InstanceCounter, Is.EqualTo(1));
                Assert.That(DbAccess.Select <Users>().Length, Is.EqualTo(20));
            }, IsolationLevel.Snapshot);
        }