public string CreateOrGetLocalDb(string requestedDbName)
{
Contract.Assert(!_disposed, "Attempt to use disposed object");
ManagedLocalDb dbName;
if(!_reservedDatabases.TryGetValue(requestedDbName, out dbName))
{
using(var transaction = new TransactionScope())
{
if(TryReserveDatabase(out dbName))
{
_reservedDatabases.Add(requestedDbName,dbName);
}
else
{
// ReSharper disable once AssignNullToNotNullAttribute
var newDBName = $"TemporaryLocalDbManager_{Guid.NewGuid()}.mdf";
dbName = new ManagedLocalDb(newDBName, isEmpty:true, isFree:false, reservationDate:DateTime.UtcNow, connectionString: ConnectionStringForDbNamed(newDBName));
using(new TransactionScope(TransactionScopeOption.Suppress))
{
_masterConnection.ExecuteNonQuery($"CREATE DATABASE [{dbName.Name}]");
}
InsertDatabase(dbName.Name);
_reservedDatabases.Add(requestedDbName,dbName);
}
transaction.Complete();
}
}
if(!dbName.IsEmpty)
{
EmptyOutDatase(dbName.Name);
}
return _reservedDatabases[requestedDbName].ConnectionString;
}