Lorsque vous démarrez un nouveau projet, vous devez à un moment vous atteler à créer les classes correspondants à vos tables SQL. Évidemment, si vous utilisez un ORM tel qu’Entity Framework, vous ne vous souciez pas de cela.
Cependant, si ce n’est pas le cas, j’ai une solution qui peut vous intéresser. Le problème c’est qu’on ne peut pas (du moins je n’en ai pas trouvé) se servir des ORM « juste » pour générer les classes la première fois et s’arrêter là.
J’ai trouvé une solution sur StackOverflow que j’ai modifié pour mes besoins. Il s’agit d’une requête SQL qui va générer en sortie le code de la classe correspondant à la table voulu.
Prenons en exemple cette table :
Voici le script :
DECLARE @TableName VARCHAR(MAX) = 'Client' -- Nom de la table DECLARE @ClassName VARCHAR(MAX) = 'Client' -- Nom de la classe (peut-être différent du nom de la table) DECLARE @TableSchema VARCHAR(MAX) = 'dbo' -- Schéma de la table DECLARE @Namespace VARCHAR(MAX) = 'MaSociété.MonApplication.Entities' -- Namespace de la classe DECLARE @ClassSummary VARCHAR(MAX) = 'Représente un client de notre société' -- Commentaire de la classe DECLARE @RESULT VARCHAR(MAX) = '' SET @RESULT = @RESULT + 'using System;' + CHAR(13) + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @RESULT = @RESULT + 'namespace ' + @Namespace + CHAR(13) + '{' + CHAR(13) END SET @RESULT = @RESULT + '/// <summary>' + CHAR(13) SET @RESULT = @RESULT + '/// ' + @ClassSummary + CHAR(13) SET @RESULT = @RESULT + '/// Table [' + @TableSchema + '].[' + @TableName + ']' + CHAR(13) SET @RESULT = @RESULT + '/// </summary>' + CHAR(13) SET @RESULT = @RESULT + 'public class ' + @ClassName + CHAR(13) + '{' + CHAR(13) SELECT @RESULT = @RESULT + CHAR(13) + '/// <summary>' + CHAR(13) + '/// TODO' + CHAR(13) + '/// </summary>' + CHAR(13) + ' public ' + ColumnType + ' ' + ColumnName + ' { get; private set; } ' + CHAR(13) FROM ( SELECT c.COLUMN_NAME AS ColumnName , CASE c.DATA_TYPE WHEN 'bigint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'long?' ELSE 'long' END WHEN 'binary' THEN 'Byte[]' WHEN 'bit' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'bool?' ELSE 'bool' END WHEN 'char' THEN 'string' WHEN 'date' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime2' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetimeoffset' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END WHEN 'decimal' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'float' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'float?' ELSE 'float' END WHEN 'image' THEN 'Byte[]' WHEN 'int' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'int?' ELSE 'int' END WHEN 'money' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'nchar' THEN 'string' WHEN 'ntext' THEN 'string' WHEN 'numeric' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'nvarchar' THEN 'string' WHEN 'real' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'double?' ELSE 'double' END WHEN 'smalldatetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'smallint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'short?' ELSE 'short'END WHEN 'smallmoney' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END WHEN 'text' THEN 'string' WHEN 'time' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END WHEN 'timestamp' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'tinyint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END WHEN 'uniqueidentifier' THEN 'Guid' WHEN 'varbinary' THEN 'Byte[]' WHEN 'varchar' THEN 'string' ELSE 'object' END AS ColumnType , c.ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = @TableName AND ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA ) t ORDER BY t.ORDINAL_POSITION SET @RESULT = @RESULT + CHAR(13) SET @RESULT = @RESULT + '/// <summary>' + CHAR(13) SET @RESULT = @RESULT + '/// Initialise une nouvelle instance de la classe <see cref="T:' + @Namespace + '.' + @ClassName + '" />.' + CHAR(13) SET @RESULT = @RESULT + '/// </summary>' + CHAR(13) SET @RESULT = @RESULT + 'public ' + @ClassName + '()' + CHAR(13) SET @RESULT = @RESULT + '{' + CHAR(13) SET @RESULT = @RESULT + '}' + CHAR(13) SET @RESULT = @RESULT + CHAR(13) SET @RESULT = @RESULT + '}' + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @RESULT = @RESULT + CHAR(13) + '}' END PRINT @RESULT |
Ce qui produit la classe :
using System; namespace MaSociété.MonApplication.Entities { /// <summary> /// Représente un client de notre société /// Table [dbo].[Client] /// </summary> public class Client { /// <summary> /// TODO /// </summary> public int ClientId { get; private set; } /// <summary> /// TODO /// </summary> public int? FournisseurId { get; private set; } /// <summary> /// TODO /// </summary> public string Nom { get; private set; } /// <summary> /// TODO /// </summary> public string Prenom { get; private set; } /// <summary> /// TODO /// </summary> public bool EstAbonne { get; private set; } /// <summary> /// Initialise une nouvelle instance de la classe <see cref="T:MaSociété.MonApplication.Entities.Client" />. /// </summary> public Client() { } } } |
Voilà, ça fait le job et plutôt bien. A vous d’adapter la requête à vos besoins.
En espérant que cela vous ait été utile !
Pas encore de commentaires