DECLARE @newline NVARCHAR(2) = CHAR(13) + CHAR(10), @tab NVARCHAR(1) = CHAR(9), @table_id INT, @table_name NVARCHAR(50), @namespace NVARCHAR(50) = 'insert.namespace.here' DECLARE table_cursor CURSOR FOR SELECT t.object_id, t.name FROM sys.tables t ORDER BY t.name OPEN table_cursor FETCH NEXT FROM table_cursor INTO @table_id, @table_name WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'namespace ' + @namespace + @newline SET @sql = @sql + '{' + @newline SET @sql = @sql + @tab + 'using System;' + @newline SET @sql = @sql + @tab + 'using System.ComponentModel.DataAnnotations;' + @newline SET @sql = @sql + @tab + 'using System.Linq;' + @newline SET @sql = @sql + @tab + 'using System.Web;' + @newline + @newline + @newline SET @sql = @sql + @tab + '[MetadataType(typeof(' + @table_name + 'Metadata))]' + @newline SET @sql = @sql + @tab + 'public partial class ' + @table_name + @newline SET @sql = @sql + @tab + '{' + @newline /************************************************************************** * Enumerate fields in class **************************************************************************/ DECLARE @column_id INT, @column_name NVARCHAR(50), @type_name NVARCHAR(50), @is_identity BIT, @is_nullable BIT, @is_rowguidcol BIT, @max_length INT, @definition NVARCHAR(MAX) DECLARE column_cursor CURSOR FOR SELECT c.object_id, c.name AS column_name, CASE t.name WHEN 'bigint' THEN 'long' WHEN 'binary' THEN 'byte[]' WHEN 'bit' THEN 'bool' WHEN 'char' THEN 'string' WHEN 'date' THEN 'DateTime' WHEN 'datetime' THEN 'DateTime' WHEN 'datetime2' THEN 'DateTime' WHEN 'datetimeoffset' THEN 'DateTimeOffset' WHEN 'decimal' THEN 'decimal' WHEN 'float' THEN 'double' WHEN 'image' THEN 'byte[]' WHEN 'int' THEN 'int' WHEN 'money' THEN 'decimal' WHEN 'nchar' THEN 'string' WHEN 'ntext' THEN 'string' WHEN 'numeric' THEN 'decimal' WHEN 'nvarchar' THEN 'string' WHEN 'real' THEN 'float' WHEN 'smalldatetime' THEN 'DateTime' WHEN 'smallint' THEN 'short' WHEN 'smallmoney' THEN 'decimal' WHEN 'text' THEN 'string' WHEN 'time' THEN 'TimeSpan' WHEN 'timestamp' THEN 'long' WHEN 'tinyint' THEN 'byte' WHEN 'uniqueidentifier' THEN 'Guid' WHEN 'varbinary' THEN 'byte[]' WHEN 'varchar' THEN 'string' ELSE 'UNKNOWN_' + t.name END, c.is_identity, c.is_nullable, c.is_rowguidcol, c.max_length, object_definition(c.default_object_id) FROM sys.columns c INNER JOIN sys.types t ON c.system_type_id = t.system_type_id WHERE t.name <> 'sysname' AND c.object_id = @table_id ORDER BY c.is_identity DESC, c.name OPEN column_cursor FETCH NEXT FROM column_cursor INTO @column_id, @column_name, @type_name, @is_identity, @is_nullable, @is_rowguidcol, @max_length, @definition WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = @sql + @tab + @tab + 'public ' + @type_name + ' ' + @column_name + ' { get; set; }' + @newline FETCH NEXT FROM column_cursor INTO @column_id, @column_name, @type_name, @is_identity, @is_nullable, @is_rowguidcol, @max_length, @definition END SET @sql = @sql + @newline CLOSE column_cursor DEALLOCATE column_cursor SET @sql = @sql + @tab + @tab + 'public static bool Create()' + @newline SET @sql = @sql + @tab + @tab + '{' + @newline SET @sql = @sql + @tab + @tab + @tab + 'throw new NotImplementedException();' + @newline SET @sql = @sql + @tab + @tab + '}' + @newline + @newline SET @sql = @sql + @tab + @tab + 'public static bool Read()' + @newline SET @sql = @sql + @tab + @tab + '{' + @newline SET @sql = @sql + @tab + @tab + @tab + 'throw new NotImplementedException();' + @newline SET @sql = @sql + @tab + @tab + '}' + @newline + @newline SET @sql = @sql + @tab + @tab + 'public static bool Update()' + @newline SET @sql = @sql + @tab + @tab + '{' + @newline SET @sql = @sql + @tab + @tab + @tab + 'throw new NotImplementedException();' + @newline SET @sql = @sql + @tab + @tab + '}' + @newline + @newline SET @sql = @sql + @tab + @tab + 'public static bool Delete()' + @newline SET @sql = @sql + @tab + @tab + '{' + @newline SET @sql = @sql + @tab + @tab + @tab + 'throw new NotImplementedException();' + @newline SET @sql = @sql + @tab + @tab + '}' + @newline + @newline SET @sql = @sql + @tab + @tab + 'private sealed class ' + @table_name + 'Metadata' + @newline SET @sql = @sql + @tab + @tab + '{' + @newline DECLARE column_cursor CURSOR FOR SELECT c.name FROM sys.columns c WHERE c.object_id = @table_id AND c.is_nullable = 0 ORDER BY c.name OPEN column_cursor FETCH NEXT FROM column_cursor INTO @column_name WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = @sql + @tab + @tab + @tab + '[Display(Name = "' + @column_name + '", Prompt = "' + @column_name + '")]' + @newline SET @sql = @sql + @tab + @tab + @tab + '[Required(AllowEmptyStrings = false, ErrorMessage = "' + @column_name + ' is required")]' + @newline SET @sql = @sql + @tab + @tab + @tab + 'public ' + @type_name + ' ' + @column_name + ' { get; set; }' + @newline + @newline FETCH NEXT FROM column_cursor INTO @column_name END CLOSE column_cursor DEALLOCATE column_cursor SET @sql = @sql + @tab + @tab + '}' + @newline SET @sql = @sql + @tab + '}' + @newline SET @sql = @sql + '}' + @newline + @newline PRINT(@sql) FETCH NEXT FROM table_cursor INTO @table_id, @table_name END CLOSE table_cursor DEALLOCATE table_cursor