C# Sınıflarından Dakikalar İçinde Veritabanı Tablolarını Otomatik Olarak Oluşturma
Veritabanı tablolarını manuel olarak oluşturmak sıkıcı bir görev olabilir, özellikle de çok sayıda sınıfla çalışıyorsanız. Eğer uzun SQL betikleri yazmadan hızlı bir şekilde tablolar oluşturmanız gerekiyorsa, doğru yerdesiniz. Bu blog yazısı, yansıma kullanarak ve biraz kod sihiri ile C# sınıflarınızdan veritabanı tablolarını otomatik olarak oluşturmanın bir çözümünü sunmaktadır.
Problem
Birden fazla C# sınıfınız olduğunu ve uygulamanız geliştikçe bu sınıflar için karşılık gelen veritabanı tablolarını oluşturmanız gerektiğini hayal edin. Bu tabloların manuel olarak oluşturulması sadece yorucu değil, aynı zamanda hatalara da açıktır. İşte basit bir C# sınıfının örneği:
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
}
Bu sınıftan bir SQL ifadesine ihtiyacınız olacak:
CREATE TABLE Foo
(
Property1 VARCHAR(500),
Property2 INT
)
Ayrıca, System.Management.ManagementObject
gibi karmaşık türlerin sınıflar içinde yönetilmesi durumu daha da karmaşık hale getirebilir; bu, Foo
sınıfının değiştirilmiş bir versiyonunda göründüğü gibi.
Çözüm
Adım 1: Ortamı Kurma
Başlamak için bir C# konsol uygulaması oluşturmanız gerekecek. Bu uygulama, sınıflarınızı inceleyecek ve bunlara karşılık gelen SQL betiklerini oluşturacaktır. İşte kodun nasıl çalıştığının basitleştirilmiş bir versiyonu:
- Assembly’i Yükleyin: C# sınıflarınızı içeren assembly’i yansıma ile yükleyin.
- Türler Üzerinde Dönüş: Assembly içindeki her sınıfı döngüyle geçin ve özelliklerini toplayın.
- SQL Betikleri Oluşturun: Her sınıf için, özelliklerine ve türlerine dayalı bir
CREATE TABLE
SQL betiği oluşturun.
Adım 2: Kod Uygulaması
İhtiyacınıza göre değiştirebileceğiniz uygulamanın merkezi kısmı burada:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace TableGenerator
{
class Program
{
static void Main(string[] args)
{
List<TableClass> tables = new List<TableClass>();
Assembly assembly = Assembly.LoadFile(args[0]);
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
TableClass tableClass = new TableClass(type);
tables.Add(tableClass);
}
foreach (TableClass table in tables)
{
Console.WriteLine(table.CreateTableScript());
Console.WriteLine();
}
}
}
public class TableClass
{
private List<KeyValuePair<string, Type>> fields = new List<KeyValuePair<string, Type>>();
public string ClassName { get; set; }
private Dictionary<Type, string> dataMapper = new Dictionary<Type, string>
{
{ typeof(int), "BIGINT" },
{ typeof(string), "NVARCHAR(500)" },
// Gerektiğinde daha fazla eşleştirme ekleyin
};
public TableClass(Type type)
{
ClassName = type.Name;
foreach (PropertyInfo property in type.GetProperties())
{
fields.Add(new KeyValuePair<string, Type>(property.Name, property.PropertyType));
}
}
public string CreateTableScript()
{
var script = new System.Text.StringBuilder();
script.AppendLine($"CREATE TABLE {ClassName}");
script.AppendLine("(");
script.AppendLine("\t ID BIGINT,");
for (int i = 0; i < fields.Count; i++)
{
var field = fields[i];
script.Append($"\t {field.Key} {(dataMapper.ContainsKey(field.Value) ? dataMapper[field.Value] : "BIGINT")}");
if (i != fields.Count - 1)
{
script.Append(",");
}
script.AppendLine();
}
script.AppendLine(")");
return script.ToString();
}
}
}
Adım 3: Kodunuzu Çalıştırma
Veri sınıflarınızı içeren assembly yüklendikten sonra, kodu çalıştırın. Benzer SQL betiklerini oluşturacaktır:
CREATE TABLE FakeDataClass
(
ID BIGINT,
AnInt BIGINT,
AString NVARCHAR(255)
)
CREATE TABLE FKClass
(
ID BIGINT,
AFKInt BIGINT
)
Ek Düşünceler
- Filtreleme için Özellikler: Sınıflarınıza yalnızca belirli sınıfların tabloya dönüştürülmesini sağlamak için
[SqlTable]
gibi özel bir özellik eklemeyi düşünün. - Geliştirmeler: Kod daha fazla optimize edilebilir ve yeniden yapılandırılabilir. Örneğin, yabancı anahtar ilişkilendirme işlemleri oldukça basit ve ek mantıkla geliştirilebilir.
Bu çözüm, C# sınıf yapıları temel alınarak SQL tablolarının otomatik olarak oluşturulması için sağlam bir başlangıç noktası sunmaktadır. İyi kodlamalar!