public void CheckHasIdentity(DbContext context) { int hasIdentity = 0; if (HasSinglePrimaryKey) { var sqlConnection = context.Database.GetDbConnection(); var currentTransaction = context.Database.CurrentTransaction; try { if (currentTransaction == null) { if (sqlConnection.State != ConnectionState.Open) { sqlConnection.Open(); } } using (var command = sqlConnection.CreateCommand()) { if (currentTransaction != null) { command.Transaction = currentTransaction.GetDbTransaction(); } command.CommandText = SqlQueryBuilder.SelectIsIdentity(FullTableName, PrimaryKeys[0]); using (var reader = command.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { hasIdentity = reader[0] == DBNull.Value ? 0 : (int)reader[0]; } } } } } finally { if (currentTransaction == null) { sqlConnection.Close(); } } } HasIdentity = hasIdentity == 1; }
public async Task CheckHasIdentityAsync(DbContext context) { int hasIdentity = 0; if (HasSinglePrimaryKey) { var sqlConnection = context.Database.GetDbConnection(); var currentTransaction = context.Database.CurrentTransaction; try { if (currentTransaction == null) { if (sqlConnection.State != ConnectionState.Open) { await sqlConnection.OpenAsync().ConfigureAwait(false); } } using (var command = sqlConnection.CreateCommand()) { if (currentTransaction != null) { command.Transaction = currentTransaction.GetDbTransaction(); } command.CommandText = SqlQueryBuilder.SelectIsIdentity(FullTableName, PrimaryKeys[0]); using (var reader = await command.ExecuteReaderAsync().ConfigureAwait(false)) { if (reader.HasRows) { while (await reader.ReadAsync().ConfigureAwait(false)) { hasIdentity = (int)reader[0]; } } } } } finally { if (currentTransaction == null) { sqlConnection.Close(); } } } HasIdentity = hasIdentity == 1; }
public static async Task MergeAsync <T>(DbContext context, IList <T> entities, TableInfo tableInfo, OperationType operationType, Action <decimal> progress) where T : class { tableInfo.InsertToTempTable = true; await tableInfo.CheckHasIdentityAsync(context).ConfigureAwait(false); await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.CreateTableCopy(tableInfo.FullTableName, tableInfo.FullTempTableName)).ConfigureAwait(false); if (tableInfo.BulkConfig.SetOutputIdentity && tableInfo.HasIdentity) { await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.CreateTableCopy(tableInfo.FullTableName, tableInfo.FullTempOutputTableName)).ConfigureAwait(false); } try { await InsertAsync(context, entities, tableInfo, progress).ConfigureAwait(false); await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.MergeTable(tableInfo, operationType)).ConfigureAwait(false); await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.DropTable(tableInfo.FullTempTableName)).ConfigureAwait(false); if (tableInfo.BulkConfig.SetOutputIdentity && tableInfo.HasIdentity) { await tableInfo.UpdateOutputIdentityAsync(context, entities).ConfigureAwait(false); await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.DropTable(tableInfo.FullTempOutputTableName)).ConfigureAwait(false); } } catch (Exception ex) { if (tableInfo.BulkConfig.SetOutputIdentity && tableInfo.HasIdentity) { await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.DropTable(tableInfo.FullTempOutputTableName)).ConfigureAwait(false); } await context.Database.ExecuteSqlCommandAsync(SqlQueryBuilder.DropTable(tableInfo.FullTempTableName)).ConfigureAwait(false); throw ex; } }
protected IQueryable <T> QueryOutputTable <T>(DbContext context) where T : class { return(context.Set <T>().FromSql(SqlQueryBuilder.SelectFromTable(this.FullTempOutputTableName, this.PrimaryKeys[0]))); }