T4 рдФрд░ SQL рдХреЛ рдкрд╛рд░ рдХрд░реЗрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрд╡рд▓рдкрд░ (рдФрд░ рди рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ / рдЬреЛрдбрд╝рдирд╛ рдерд╛ред рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ T4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдХрд┐рдпрд╛ред
рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рд╣реИ:

SET IDENTITY_INSERT dbo.Config ON INSERT INTO dbo.Config(ID, ColorId, CategoryId, Name) VALUES(2, 2, 4, N' ') SET IDENTITY_INSERT dbo.Config OFF INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 2, 4) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 1, 1) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 3, 3) 

C # рдХреЛрдб рдореЗрдВ рдмрджрд▓реЗрдВ:

 var config = new ConfigTable(); config.Color = "Green"; config.Category = "Bus"; config.Name = " "; config.Id = 2; config.Details.Add("Wheel", 4); config.Details.Add("Engine", 1); config.Details.Add("Door", 3); 


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд╣реИрдВ:



рддрд╛рд▓рд┐рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ
 CREATE TABLE dbo.Color ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(20) NOT NULL ) CREATE TABLE dbo.Category ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(20) NOT NULL ) CREATE TABLE dbo.Detail( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, Name NVARCHAR(20) NOT NULL ) CREATE TABLE dbo.Config( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, Name] nvarchar(20) NOT NULL, ColorID int NOT NULL, CategoryID int NOT NULL, ) GO ALTER TABLE dbo.Config WITH CHECK ADD CONSTRAINT FK_Config_Category FOREIGN KEY(CategoryID) REFERENCES dbo.Category(ID) GO ALTER TABLE dbo.Config WITH CHECK ADD CONSTRAINT FK_Config_Color FOREIGN KEY(ColorID) REFERENCES dbo.Color (ID) GO CREATE TABLE dbo.CarDetail( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, ConfigID int NOT NULL, DetailID int NOT NULL, Count int NOT NULL) GO ALTER TABLE dbo.CarDetail WITH CHECK ADD CONSTRAINT FK_CarDetail2Config FOREIGN KEY(ConfigID) REFERENCES dbo.Config (ID) GO ALTER TABLE dbo.CarDetail WITH CHECK ADD CONSTRAINT FK_CarDetail2Detail FOREIGN KEY(DetailID) REFERENCES dbo.Detail (ID) 


рдореИрдВ рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдХрд╛рд░рдбреЗрдЯ рдЯреЗрдмрд▓ рдХреЛ рднрд░рдиреЗ рдФрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд░рдВрдЧ, рд╢реНрд░реЗрдгреА, рд╡рд┐рд╡рд░рдг рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рджреЗрдВ:


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реАрдПрд╕ реирежрезреж/реирежрезреи рдХреЛ рдЦреЛрд▓реЗрдВ, рдПрдХ рд╕рдорд╛рдзрд╛рди T SqlT4 тАЩрдмрдирд╛рдПрдВ, рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ l SqlTemplateтАЩ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде Tables.cs рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВ:

 namespace SqlTemplate { public static class ColorTable { static ColorTable() { Dic = new Dictionary<string, int> { {"Red", 1},{"Green", 2},{"Blue", 3},{"Orange", 4} }; } public static Dictionary<string, int> Dic { get; set; } } public static class CategoryTable { static CategoryTable() { Dic = new Dictionary<string, int> { {"Bike", 1},{"Car", 2},{"Truck", 3},{"Bus", 4} }; } public static Dictionary<string, int> Dic { get; set; } } public static class DetailTable { static DetailTable() { Dic = new Dictionary<string, int> { {"Engine", 1},{"Wheel", 2},{"Door", 3} }; } public static Dictionary<string, int> Dic { get; set; } } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд░рдВрдЧ, рд╢реНрд░реЗрдгреА, рд╡рд┐рд╕реНрддрд╛рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИред
рдЕрдЧрд▓рд╛, рдирд┐рдореНрди рдХреЛрдб рдХреЗ рд╕рд╛рде 'SqlTemplate' рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ 'config.cs' рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:

 namespace SqlTemplate { public class ConfigTable { public int Id { get; set; } public string Name { get; set; } public string Color { get; set; } public string Category { get; set; } public int ColorId { get { return ColorTable.Dic[Color]; } } public int CategoryId { get { return CategoryTable.Dic[Category]; } } private Dictionary<string, int> _details = new Dictionary<string, int>(); public Dictionary<string, int> Details { get { return _details; } } public Dictionary<int, int> DetailIdList { get { return Details.ToDictionary(detail => DetailTable.Dic[detail.Key], detail => detail.Value); } } } } 

рдпреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реЗрд▓ рдорд╛рди рд╣реИрдВред
рд╣рдо рд╕рдорд╛рдзрд╛рди рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ 'SqlT4' рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо 'SqlTemplate' рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ 'GreenBus.tt' рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ - рдпрд╣ T4 рдлрд╝рд╛рдЗрд▓ рд╣реИред рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдЗрд╕ рддрд░рд╣ рд╣реЛрдиреЗ рджреЛ;

 <#@ output extension=".sql" #> <#@ Assembly name="$(SolutionDir)SqlT4\bin\Debug\SqlTemplate.dll"#> <#@ import namespace="System" #> <#@ import namespace="SqlTemplate" #> <# var config = new ConfigTable(); config.Color = "Green"; config.Category = "Bus"; config.Name = " "; config.Id = 2; config.Details.Add("Wheel", 4); config.Details.Add("Engine", 1); config.Details.Add("Door", 3); #> SET IDENTITY_INSERT dbo.Config ON INSERT INTO dbo.Config(ID, ColorId, CategoryId, Name) VALUES(<#= config.Id #>, <#= config.ColorId #>, <#= config.CategoryId #>, N'<#= config.Name #>') SET IDENTITY_INSERT dbo.Config OFF <#foreach (var dIter in config.DetailIdList){#> INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(<#= config.Id #>, <#= dIter.Key #>, <#= dIter.Value #>) <#}#> --   UPDATE dbo.Config SET Name = N'<#= config.Name #>' , ColorId = <#= config.ColorId #> , CategoryId = <#= config.CategoryId #> WHERE ID = <#= config.Id #> 

рд╣рдо рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 SET IDENTITY_INSERT dbo.Config ON INSERT INTO dbo.Config(ID, ColorId, CategoryId, Name) VALUES(2, 2, 4, N' ') SET IDENTITY_INSERT dbo.Config OFF INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 2, 4) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 1, 1) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 3, 3) --   UPDATE dbo.Config SET Name = N' ' , ColorId = 2 , CategoryId = 4 WHERE ID = 2 

рдкреЗрд╢реЗрд╡рд░реЛрдВ:
  1. рд╕рдордп рдмрдЪрд╛рдПрдВ (рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕рдордп рдмрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╡рди рдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ)
  2. рдЖрдк рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рд╕рдордп рдЖрдк рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/In159849/


All Articles