|
| 1 | +using Chapter10.Model; |
| 2 | +using Cshapter10; |
| 3 | +using System.Reflection; |
| 4 | +using System.Text; |
| 5 | + |
| 6 | +namespace Chapter10; |
| 7 | + |
| 8 | +/* |
| 9 | + Kendisine verilen nesneler için gerekli SQL Tablo oluşturma script'lerini üretir. |
| 10 | + Bir nevi otomatik kod üretici olarak düşünebiliriz. |
| 11 | + Kendisine ait bir runtime'ı vardır. Dolayısıyla çalışma zamanında okuduğu sınıflar için |
| 12 | + Create Table script'leri hazırlar. |
| 13 | +
|
| 14 | + EF'in Migration Tool'u (CLI) göz önüne getirilebilir. |
| 15 | +*/ |
| 16 | +internal class MigrationProvider |
| 17 | +{ |
| 18 | + /* |
| 19 | + CrateTableScript metodu EntityBase sınıfından türemiş sınıflarla çalışacak şekilde |
| 20 | + tasarlanmıştır. Görevi, instance örneğinin Table ve Column attribute'larını tarayıp |
| 21 | + uygun Create Table script'ini üretmektir |
| 22 | + */ |
| 23 | + public static string CreateTableScript<T>(T instance) |
| 24 | + where T : EntityBase |
| 25 | + { |
| 26 | + var builder = new StringBuilder(); |
| 27 | + builder.Append("CREATE OR ALTER TABLE "); |
| 28 | + var instanceType = typeof(T); // Burada instance değişkeni ile gelen type bilgisini yakalarız |
| 29 | + |
| 30 | + // TableAttribute'u yakalıyoruz |
| 31 | + var tableAttribute = instanceType.GetCustomAttribute<TableAttribute>(); |
| 32 | + if (tableAttribute != null) // Eğer uygulanmışsa şema adı ve tablo adını kullan |
| 33 | + { |
| 34 | + builder.AppendLine($"{tableAttribute.Schema}.{tableAttribute.Name} ("); |
| 35 | + } |
| 36 | + else // Eğer TableAttribute uygulanmamışsa varsayılan tablo adı için sınıf adı kullanılabilir |
| 37 | + { |
| 38 | + builder.AppendLine($"{instanceType.Name} ("); |
| 39 | + } |
| 40 | + |
| 41 | + // Type üzerindeki tüm property üyelerini dolaşıyoruz. |
| 42 | + foreach (var property in instanceType.GetProperties()) |
| 43 | + { |
| 44 | + // Eğer bu özellik ColumnAttribute'u uygulamışsa kolonları ona göre ekliyoruz |
| 45 | + var columnAttribute = property.GetCustomAttribute<ColumnAttribute>(); |
| 46 | + if (columnAttribute != null) |
| 47 | + { |
| 48 | + // Text türünde bir alansa length bilgisi gerekeceğinden bu tip bir ayrıma gittik |
| 49 | + if (columnAttribute.DataType == SqlDataType.Text) |
| 50 | + { |
| 51 | + builder.AppendLine($"\t{columnAttribute.Name} {columnAttribute.DataType}({columnAttribute.Length}),"); |
| 52 | + }else |
| 53 | + { |
| 54 | + builder.AppendLine($"\t{columnAttribute.Name} {columnAttribute.DataType},"); |
| 55 | + } |
| 56 | + } |
| 57 | + else |
| 58 | + { |
| 59 | + builder.AppendLine($"\t{property.Name},"); |
| 60 | + //TODO@buraksenyurt Eğer ColumnAttribute uygulanmadıysa özellik tipine bakarak varsayılan bir tanımlama yapılmalı |
| 61 | + } |
| 62 | + } |
| 63 | + |
| 64 | + var script = builder.ToString()[..(builder.Length - 3)] + "\n)\nGo"; |
| 65 | + return script; |
| 66 | + } |
| 67 | + |
| 68 | + internal static void SaveScript(string script, string filePath) |
| 69 | + { |
| 70 | + var fPath = Path.Combine(Environment.CurrentDirectory,filePath); |
| 71 | + File.WriteAllText(fPath,script); |
| 72 | + } |
| 73 | +} |
0 commit comments