/// <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; }
/// <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; }
/// <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); }); }
/// <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); }