Default Constraint Methods
Default constraint methods provide comprehensive functionality for managing default value constraints across all supported database providers. Default constraints automatically provide values for columns when no value is explicitly specified during INSERT operations.
Quick Navigation
- Default Constraint Existence Checking
- DoesDefaultConstraintExistAsync - Check if named default constraint exists
- DoesDefaultConstraintExistOnColumnAsync - Check if any default constraint exists on column
- Default Constraint Creation
- CreateDefaultConstraintIfNotExistsAsync (Model) - Create from DmDefaultConstraint model
- CreateDefaultConstraintIfNotExistsAsync (Parameters) - Create with individual parameters
- Default Constraint Discovery
- GetDefaultConstraintNamesAsync - Get list of default constraint names with filtering
- GetDefaultConstraintNameOnColumnAsync - Get default constraint name on specific column
- GetDefaultConstraintsAsync - Get complete default constraint models
- GetDefaultConstraintAsync - Get single default constraint by name
- GetDefaultConstraintOnColumnAsync - Get default constraint model on specific column
- Default Constraint Deletion
- DropDefaultConstraintIfExistsAsync - Drop default constraint by name
- DropDefaultConstraintOnColumnIfExistsAsync - Drop default constraint on specific column
Default Constraint Existence Checking
DoesDefaultConstraintExistAsync
Check if a specific named default constraint exists.
// Check if named default constraint exists
var constraintName = "DF_Orders_OrderDate";
bool exists = await connection.DoesDefaultConstraintExistAsync("sales", "orders", constraintName);
if (exists)
{
Console.WriteLine($"Default constraint '{constraintName}' exists");
// Get the default constraint details
var defaultConstraint = await connection.GetDefaultConstraintAsync("sales", "orders", constraintName);
if (defaultConstraint != null)
{
Console.WriteLine($"Expression: {defaultConstraint.Expression}");
Console.WriteLine($"Column: {defaultConstraint.ColumnName}");
}
}
else
{
Console.WriteLine($"Default constraint '{constraintName}' does not exist");
}
// With transaction and cancellation
using var transaction = connection.BeginTransaction();
bool exists = await connection.DoesDefaultConstraintExistAsync(
"sales",
"orders",
constraintName,
tx: transaction,
cancellationToken: cancellationToken
);
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the default constraintconstraintName
- Name of the default constraint to checktx
(optional) - Database transactioncancellationToken
(optional) - Cancellation token
Returns: bool
- true
if default constraint exists, false
otherwise
DoesDefaultConstraintExistOnColumnAsync
Check if any default constraint exists on a specific column.
// Check if any default constraint exists on a column
bool hasDefault = await connection.DoesDefaultConstraintExistOnColumnAsync("sales", "orders", "order_date");
if (hasDefault)
{
Console.WriteLine("Column 'order_date' has a default constraint");
// Get the default constraint on this column
var constraint = await connection.GetDefaultConstraintOnColumnAsync("sales", "orders", "order_date");
if (constraint != null)
{
Console.WriteLine($"Default constraint '{constraint.ConstraintName}' expression: {constraint.Expression}");
}
}
else
{
Console.WriteLine("Column 'order_date' has no default constraint");
}
// With transaction
using var transaction = connection.BeginTransaction();
bool exists = await connection.DoesDefaultConstraintExistOnColumnAsync(
"hr", "employees", "hire_date", tx: transaction);
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the columncolumnName
- Name of the column to check for default constraintstx
(optional) - Database transactioncancellationToken
(optional) - Cancellation token
Returns: bool
- true
if any default constraint exists on the column, false
otherwise
Default Constraint Creation
CreateDefaultConstraintIfNotExistsAsync (DmDefaultConstraint)
Create a default constraint only if it doesn't already exist using a DmDefaultConstraint model.
// Create default constraint if it doesn't exist
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync("sales", "orders", defaultConstraint);
if (created)
{
Console.WriteLine($"Default constraint '{defaultConstraint.ConstraintName}' was created");
}
else
{
Console.WriteLine($"Default constraint '{defaultConstraint.ConstraintName}' already existed");
}
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table to add default constraint todefaultConstraint
- DmDefaultConstraint model defining the constrainttx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: bool
- true
if default constraint was created, false
if it already existed
CreateDefaultConstraintIfNotExistsAsync (Parameters)
Create a default constraint using individual parameters for convenience.
// Current timestamp default for order date
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync(
schemaName: "sales",
tableName: "orders",
constraintName: "DF_Orders_OrderDate",
columnName: "order_date",
expression: "GETDATE()"
);
// GUID default for new IDs
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync(
"app",
"users",
"DF_Users_UserId",
"user_id",
"NEWID()",
tx: transaction,
commandTimeout: 60,
cancellationToken: cancellationToken
);
// Boolean default for active status
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync(
"hr",
"employees",
"DF_Employees_IsActive",
"is_active",
"1"
);
// Numeric default for quantity
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync(
"inventory",
"products",
"DF_Products_MinQuantity",
"min_quantity",
"0"
);
// String default for status
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync(
"orders",
"order_items",
"DF_OrderItems_Status",
"status",
"'pending'"
);
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table to add constraint toconstraintName
- Name of the default constraintcolumnName
- Name of the column to apply default toexpression
- SQL expression that provides the default valuetx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: bool
- true
if default constraint was created, false
if it already existed
Default Constraint Discovery
GetDefaultConstraintNamesAsync
Retrieve a list of default constraint names from a table, with optional filtering.
// Get all default constraint names on a table
List<string> allConstraints = await connection.GetDefaultConstraintNamesAsync("sales", "orders");
foreach (string constraintName in allConstraints)
{
Console.WriteLine($"Found default constraint: {constraintName}");
}
// Get default constraint names with wildcard filter
List<string> dateDefaults = await connection.GetDefaultConstraintNamesAsync("sales", "orders", "DF_*_Date*");
// Finds: DF_Orders_OrderDate, DF_Orders_ShipDate, etc.
// Get constraints with pattern matching
List<string> idDefaults = await connection.GetDefaultConstraintNamesAsync("app", "users", "*_Id");
// Finds: DF_Users_UserId, DF_Users_TenantId, etc.
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table to searchnameFilter
(optional) - Wildcard pattern to filter constraint names (*
= any characters,?
= single character)tx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: List<string>
- List of matching default constraint names
GetDefaultConstraintNameOnColumnAsync
Get the default constraint name that applies to a specific column.
// Get default constraint name on a specific column
string? constraintName = await connection.GetDefaultConstraintNameOnColumnAsync("sales", "orders", "order_date");
if (constraintName != null)
{
Console.WriteLine($"Default constraint on 'order_date': {constraintName}");
// Get full details of the default constraint
var constraint = await connection.GetDefaultConstraintAsync("sales", "orders", constraintName);
if (constraint != null)
{
Console.WriteLine($"Expression: {constraint.Expression}");
}
}
else
{
Console.WriteLine("No default constraint found on 'order_date' column");
}
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the columncolumnName
- Name of the column to find default constraint fortx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: string?
- Name of the default constraint, or null
if none exists on the column
GetDefaultConstraintsAsync
Retrieve complete DmDefaultConstraint models for table default constraints.
// Get all default constraints with full structure information
List<DmDefaultConstraint> defaultConstraints = await connection.GetDefaultConstraintsAsync("sales", "orders");
foreach (var constraint in defaultConstraints)
{
Console.WriteLine($"Default Constraint: {constraint.ConstraintName}");
Console.WriteLine($" Column: {constraint.ColumnName}");
Console.WriteLine($" Expression: {constraint.Expression}");
Console.WriteLine($" Schema: {constraint.SchemaName}");
Console.WriteLine($" Table: {constraint.TableName}");
}
// Get specific default constraints with pattern
List<DmDefaultConstraint> timestampDefaults = await connection.GetDefaultConstraintsAsync("app", "audit_log", "DF_*_Date*");
// With transaction
using var transaction = connection.BeginTransaction();
List<DmDefaultConstraint> constraints = await connection.GetDefaultConstraintsAsync("hr", "employees", tx: transaction);
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table to searchnameFilter
(optional) - Wildcard pattern to filter constraint namestx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: List<DmDefaultConstraint>
- List of complete DmDefaultConstraint models
GetDefaultConstraintAsync
Retrieve a single DmDefaultConstraint model for a specific default constraint.
// Get specific default constraint structure
DmDefaultConstraint? constraint = await connection.GetDefaultConstraintAsync("sales", "orders", "DF_Orders_OrderDate");
if (constraint != null)
{
Console.WriteLine($"Default Constraint '{constraint.ConstraintName}' details:");
Console.WriteLine($" Table: {constraint.SchemaName}.{constraint.TableName}");
Console.WriteLine($" Column: {constraint.ColumnName}");
Console.WriteLine($" Expression: {constraint.Expression}");
// Analyze the constraint expression
if (constraint.Expression.Contains("GETDATE()") || constraint.Expression.Contains("NOW()"))
{
Console.WriteLine(" This provides current timestamp as default");
}
else if (constraint.Expression.Contains("NEWID()") || constraint.Expression.Contains("UUID()"))
{
Console.WriteLine(" This provides unique identifier as default");
}
else if (constraint.Expression == "0" || constraint.Expression == "1")
{
Console.WriteLine(" This provides numeric/boolean default");
}
}
else
{
Console.WriteLine("Default constraint not found");
}
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the constraintconstraintName
- Name of the default constraint to retrievetx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: DmDefaultConstraint?
- Complete default constraint model, or null
if not found
GetDefaultConstraintOnColumnAsync
Retrieve the default constraint that applies to a specific column.
// Get default constraint on a specific column
DmDefaultConstraint? constraint = await connection.GetDefaultConstraintOnColumnAsync("sales", "orders", "order_date");
if (constraint != null)
{
Console.WriteLine($"Default constraint on 'order_date': {constraint.ConstraintName}");
Console.WriteLine($"Expression: {constraint.Expression}");
// Check constraint type
if (constraint.Expression.Contains("GETDATE()"))
{
Console.WriteLine("✅ Uses current date/time as default");
}
else if (constraint.Expression.Contains("0"))
{
Console.WriteLine("📊 Uses zero as default value");
}
}
else
{
Console.WriteLine("No default constraint found on 'order_date' column");
}
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the columncolumnName
- Name of the column to find default constraint fortx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: DmDefaultConstraint?
- Default constraint model, or null
if none exists on the column
Default Constraint Deletion
DropDefaultConstraintIfExistsAsync
Remove a default constraint from a table if it exists.
// Drop default constraint if it exists
bool dropped = await connection.DropDefaultConstraintIfExistsAsync("sales", "orders", "DF_Orders_OrderDate");
if (dropped)
{
Console.WriteLine("Default constraint was dropped");
}
else
{
Console.WriteLine("Default constraint did not exist");
}
// Batch drop multiple default constraints
var constraintsToRemove = new[] { "DF_Orders_TempDefault", "DF_Orders_OldDefault", "DF_Orders_BackupDefault" };
foreach (var constraintName in constraintsToRemove)
{
bool wasDropped = await connection.DropDefaultConstraintIfExistsAsync("sales", "orders", constraintName);
Console.WriteLine($"Default constraint '{constraintName}': {(wasDropped ? "Dropped" : "Not found")}");
}
// With transaction
using var transaction = connection.BeginTransaction();
try
{
bool dropped = await connection.DropDefaultConstraintIfExistsAsync("sales", "orders", "DF_Orders_OrderDate", tx: transaction);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the constraintconstraintName
- Name of the default constraint to droptx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: bool
- true
if default constraint was dropped, false
if it didn't exist
DropDefaultConstraintOnColumnIfExistsAsync
Remove the default constraint that applies to a specific column.
// Drop default constraint on a specific column
bool dropped = await connection.DropDefaultConstraintOnColumnIfExistsAsync("sales", "orders", "legacy_status");
if (dropped)
{
Console.WriteLine("Default constraint on 'legacy_status' was dropped");
// Now safe to modify or drop the column
await connection.DropColumnIfExistsAsync("sales", "orders", "legacy_status");
}
else
{
Console.WriteLine("No default constraint found on 'legacy_status'");
}
// Useful before column modifications
await connection.DropDefaultConstraintOnColumnIfExistsAsync("hr", "employees", "salary");
// Now safe to modify the salary column defaults
await connection.CreateDefaultConstraintIfNotExistsAsync(
"hr", "employees", "DF_Employees_DefaultSalary", "salary", "0.00");
Parameters:
schemaName
- Schema containing the tabletableName
- Name of the table containing the constraintcolumnName
- Name of the column to drop default constraint fortx
(optional) - Database transactioncommandTimeout
(optional) - Command timeout in secondscancellationToken
(optional) - Cancellation token
Returns: bool
- true
if default constraint was dropped, false
if none existed on the column
Practical Examples
Standard Default Values Setup
public async Task SetupStandardDefaultsAsync(IDbConnection connection)
{
using var transaction = connection.BeginTransaction();
try
{
// User table defaults
await connection.CreateDefaultConstraintIfNotExistsAsync(
"app", "users", "DF_Users_CreatedAt", "created_at", "GETDATE()", tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
"app", "users", "DF_Users_IsActive", "is_active", "1", tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
"app", "users", "DF_Users_UserId", "user_id", "NEWID()", tx: transaction);
// Order table defaults
await connection.CreateDefaultConstraintIfNotExistsAsync(
"sales", "orders", "DF_Orders_OrderDate", "order_date", "GETDATE()", tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
"sales", "orders", "DF_Orders_Status", "status", "'pending'", tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
"sales", "orders", "DF_Orders_Total", "total_amount", "0.00", tx: transaction);
// Product table defaults
await connection.CreateDefaultConstraintIfNotExistsAsync(
"inventory", "products", "DF_Products_CreatedAt", "created_at", "GETDATE()", tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
"inventory", "products", "DF_Products_IsActive", "is_active", "1", tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
"inventory", "products", "DF_Products_StockLevel", "stock_level", "0", tx: transaction);
transaction.Commit();
Console.WriteLine("Standard default constraints created successfully");
}
catch
{
transaction.Rollback();
throw;
}
}
Default Constraint Analysis
public async Task AnalyzeDefaultConstraintsAsync(IDbConnection connection, string schema)
{
var tables = await connection.GetTableNamesAsync(schema);
Console.WriteLine($"Default Constraint Analysis for schema '{schema}':");
var totalConstraints = 0;
var tablesWithDefaults = new List<string>();
var expressionTypes = new Dictionary<string, int>();
var columnTypes = new Dictionary<string, int>();
foreach (var tableName in tables)
{
var constraints = await connection.GetDefaultConstraintsAsync(schema, tableName);
if (constraints.Any())
{
tablesWithDefaults.Add(tableName);
totalConstraints += constraints.Count;
foreach (var constraint in constraints)
{
Console.WriteLine($" {tableName}.{constraint.ConstraintName}:");
Console.WriteLine($" Column: {constraint.ColumnName}");
Console.WriteLine($" Expression: {constraint.Expression}");
// Categorize expression types
var expressionType = CategorizeExpression(constraint.Expression);
expressionTypes[expressionType] = expressionTypes.GetValueOrDefault(expressionType, 0) + 1;
// Categorize column types
var columnType = CategorizeColumnType(constraint.ColumnName);
columnTypes[columnType] = columnTypes.GetValueOrDefault(columnType, 0) + 1;
}
}
}
Console.WriteLine($"\nSummary:");
Console.WriteLine($"Total tables: {tables.Count}");
Console.WriteLine($"Tables with default constraints: {tablesWithDefaults.Count}");
Console.WriteLine($"Total default constraints: {totalConstraints}");
Console.WriteLine("\nExpression Types:");
foreach (var (type, count) in expressionTypes.OrderByDescending(kvp => kvp.Value))
{
Console.WriteLine($" {type}: {count}");
}
Console.WriteLine("\nColumn Types:");
foreach (var (type, count) in columnTypes.OrderByDescending(kvp => kvp.Value))
{
Console.WriteLine($" {type}: {count}");
}
}
private string CategorizeExpression(string expression)
{
var expr = expression.ToUpper();
if (expr.Contains("GETDATE()") || expr.Contains("NOW()")) return "Timestamp";
if (expr.Contains("NEWID()") || expr.Contains("UUID()")) return "GUID";
if (expr == "0" || expr == "1") return "Numeric";
if (expr.StartsWith("'") && expr.EndsWith("'")) return "String Literal";
if (expr.Contains("USER") || expr.Contains("SYSTEM")) return "System Function";
return "Other";
}
private string CategorizeColumnType(string columnName)
{
var name = columnName.ToLower();
if (name.Contains("date") || name.Contains("time")) return "Date/Time";
if (name.Contains("id") || name.Contains("key")) return "Identifier";
if (name.Contains("active") || name.Contains("enabled") || name.Contains("flag")) return "Boolean";
if (name.Contains("status") || name.Contains("state")) return "Status";
if (name.Contains("count") || name.Contains("quantity") || name.Contains("amount")) return "Numeric";
return "Other";
}
Default Constraint Maintenance
public async Task StandardizeDefaultConstraintNamesAsync(IDbConnection connection, string schema)
{
var tables = await connection.GetTableNamesAsync(schema);
foreach (var tableName in tables)
{
var constraints = await connection.GetDefaultConstraintsAsync(schema, tableName);
foreach (var constraint in constraints)
{
// Check if constraint name follows standard convention: DF_TableName_ColumnName
var expectedName = $"DF_{tableName}_{constraint.ColumnName}";
if (constraint.ConstraintName != expectedName)
{
Console.WriteLine($"Non-standard constraint name: {constraint.ConstraintName}");
Console.WriteLine($"Expected: {expectedName}");
Console.WriteLine($"Column: {constraint.ColumnName}");
Console.WriteLine($"Expression: {constraint.Expression}");
// Note: Renaming constraints would require dropping and recreating
// This is left as an exercise since it's database-specific
}
}
}
}
public async Task ValidateDefaultExpressionsAsync(IDbConnection connection, string schema)
{
Console.WriteLine($"Validating default constraint expressions in schema '{schema}'...");
var tables = await connection.GetTableNamesAsync(schema);
var validationIssues = new List<string>();
foreach (var tableName in tables)
{
var constraints = await connection.GetDefaultConstraintsAsync(schema, tableName);
foreach (var constraint in constraints)
{
// Check for common issues with default expressions
if (string.IsNullOrWhiteSpace(constraint.Expression))
{
validationIssues.Add($"Constraint '{constraint.ConstraintName}' has empty expression");
}
if (constraint.Expression.Contains("--") || constraint.Expression.Contains("/*"))
{
validationIssues.Add($"Constraint '{constraint.ConstraintName}' contains SQL comments - potential issue");
}
if (constraint.Expression.Length > 1000)
{
validationIssues.Add($"Constraint '{constraint.ConstraintName}' has very long expression (>{constraint.Expression.Length} chars)");
}
// Check for potentially problematic expressions
if (constraint.Expression.Contains("SELECT"))
{
validationIssues.Add($"Constraint '{constraint.ConstraintName}' contains SELECT - may cause performance issues");
}
Console.WriteLine($"✅ Constraint '{constraint.ConstraintName}' on {tableName}.{constraint.ColumnName} validated");
}
}
if (validationIssues.Any())
{
Console.WriteLine($"\n⚠️ Found {validationIssues.Count} potential issues:");
foreach (var issue in validationIssues)
{
Console.WriteLine($" - {issue}");
}
}
else
{
Console.WriteLine("\n✅ All default constraints appear to be valid");
}
}
public async Task CleanupTemporaryDefaultsAsync(IDbConnection connection, string schema)
{
var tables = await connection.GetTableNamesAsync(schema);
var cleanedCount = 0;
foreach (var tableName in tables)
{
var constraintNames = await connection.GetDefaultConstraintNamesAsync(schema, tableName);
var tempConstraints = constraintNames.Where(name =>
name.Contains("temp_") ||
name.Contains("_temp") ||
name.StartsWith("tmp_") ||
name.EndsWith("_backup") ||
name.Contains("_old_")).ToList();
foreach (var constraintName in tempConstraints)
{
bool dropped = await connection.DropDefaultConstraintIfExistsAsync(schema, tableName, constraintName);
if (dropped)
{
Console.WriteLine($"Cleaned up temporary default constraint: {constraintName}");
cleanedCount++;
}
}
}
Console.WriteLine($"Cleaned up {cleanedCount} temporary default constraints");
}
Advanced Default Management
public async Task MigrateDefaultConstraintsAsync(IDbConnection connection, string schema, string tableName)
{
using var transaction = connection.BeginTransaction();
try
{
// Get current default constraints
var currentDefaults = await connection.GetDefaultConstraintsAsync(schema, tableName, tx: transaction);
var migrationActions = new List<string>();
foreach (var constraint in currentDefaults)
{
// Example: Update old timestamp defaults to use newer functions
if (constraint.Expression.Contains("GETDATE()"))
{
var newExpression = constraint.Expression.Replace("GETDATE()", "SYSDATETIME()");
// Drop old constraint
await connection.DropDefaultConstraintIfExistsAsync(
schema, tableName, constraint.ConstraintName, tx: transaction);
// Create new constraint with updated expression
await connection.CreateDefaultConstraintIfNotExistsAsync(
schema, tableName, constraint.ConstraintName, constraint.ColumnName,
newExpression, tx: transaction);
migrationActions.Add($"Updated {constraint.ConstraintName}: GETDATE() → SYSDATETIME()");
}
// Example: Standardize string defaults
if (constraint.Expression == "''")
{
var newExpression = "'N/A'";
await connection.DropDefaultConstraintIfExistsAsync(
schema, tableName, constraint.ConstraintName, tx: transaction);
await connection.CreateDefaultConstraintIfNotExistsAsync(
schema, tableName, constraint.ConstraintName, constraint.ColumnName,
newExpression, tx: transaction);
migrationActions.Add($"Updated {constraint.ConstraintName}: empty string → 'N/A'");
}
}
transaction.Commit();
if (migrationActions.Any())
{
Console.WriteLine($"Migrated {migrationActions.Count} default constraints:");
foreach (var action in migrationActions)
{
Console.WriteLine($" ✅ {action}");
}
}
else
{
Console.WriteLine("No default constraints required migration");
}
}
catch
{
transaction.Rollback();
throw;
}
}
public async Task CreateProviderOptimizedDefaultsAsync(IDbConnection connection, string schema, string tableName, string columnName, Type columnType)
{
var provider = connection.GetDbProviderType();
string expression;
string constraintName = $"DF_{tableName}_{columnName}";
// Create provider-optimized default expressions
switch (columnType)
{
case Type t when t == typeof(DateTime):
expression = provider switch
{
DbProviderType.SqlServer => "SYSDATETIME()",
DbProviderType.MySql => "NOW(6)",
DbProviderType.PostgreSql => "NOW()",
DbProviderType.Sqlite => "datetime('now')",
_ => "CURRENT_TIMESTAMP"
};
break;
case Type t when t == typeof(Guid):
expression = provider switch
{
DbProviderType.SqlServer => "NEWID()",
DbProviderType.MySql => "UUID()",
DbProviderType.PostgreSql => "gen_random_uuid()",
_ => "NEWID()" // Fallback, may not work on all providers
};
break;
case Type t when t == typeof(bool):
expression = provider switch
{
DbProviderType.SqlServer => "0",
DbProviderType.MySql => "0",
DbProviderType.PostgreSql => "false",
DbProviderType.Sqlite => "0",
_ => "0"
};
break;
default:
expression = "NULL";
break;
}
bool created = await connection.CreateDefaultConstraintIfNotExistsAsync(
schema, tableName, constraintName, columnName, expression);
if (created)
{
Console.WriteLine($"Created provider-optimized default for {tableName}.{columnName}: {expression}");
}
}
Default constraint methods provide essential functionality for ensuring data consistency by automatically providing appropriate values when columns are not explicitly set during INSERT operations across all supported database providers.