كيفية توليد جداول قاعدة البيانات تلقائيًا من فئات C# في دقائق
يمكن أن تكون عملية إنشاء جداول قاعدة البيانات يدويًا مهمة شاقة، خاصة عند التعامل مع عدد كبير من الفئات. إذا كنت في موقف تحتاج فيه إلى توليد الجداول بسرعة دون الحاجة إلى كتابة نصوص SQL مطولة، فأنت في المكان الصحيح. يقدم لك هذا المنشور في المدونة حلًا لتوليد جداول قاعدة البيانات تلقائيًا مباشرة من فئات C# الخاصة بك باستخدام الانعكاس وقليل من سحر الترميز.
المشكلة
تخيل أن لديك عدة فئات C#، ومع نمو تطبيقك، تحتاج إلى إنشاء جداول قاعدة بيانات مقابلة لهذه الفئات. إن إنشاء هذه الجداول يدويًا ليس مرهقًا فحسب، بل عرضة أيضًا للأخطاء. إليك مثال على فئة C# بسيطة:
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; }
}
}
من هذه الفئة، ستحتاج إلى جملة SQL كالتالي:
CREATE TABLE Foo
(
Property1 VARCHAR(500),
Property2 INT
)
بالإضافة إلى ذلك، فإن التعامل مع الأنواع المعقدة داخل الفئات، مثل System.Management.ManagementObject
، يمكن أن يعقد الأمور أكثر، كما هو موضح في نسخة معدلة من فئة Foo
.
الحل
الخطوة 1: إعداد البيئة
للبدء، ستحتاج إلى إنشاء تطبيق كونسول في C#. سيتفقد هذا التطبيق فئاتك وينشئ نصوص SQL المقابلة لها. إليك نسخة مبسطة عن كيفية عمل الكود:
- تحميل التجميع: استخدام الانعكاس لتحميل التجميع الذي يحتوي على فئات C# الخاصة بك.
- تكرار من خلال الأنواع: قم بالتكرار عبر كل فئة داخل التجميع وجمع خصائصها.
- إنشاء نصوص SQL: لكل فئة، قم بإنشاء نص SQL من نوع
CREATE TABLE
مستندًا إلى خصائصها وأنواعها.
الخطوة 2: تنفيذ الكود
إليك جوهر التنفيذ الذي يمكنك تعديله ليناسب احتياجاتك.
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)" },
// أضف المزيد من الخرائط حسب الحاجة
};
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();
}
}
}
الخطوة 3: تشغيل الكود الخاص بك
بمجرد تحميل التجميع بالفئات البيانات الخاصة بك، ببساطة قم بتشغيل الكود. سيو produz نصوص SQL تجريدية مشابهة لـ:
CREATE TABLE FakeDataClass
(
ID BIGINT,
AnInt BIGINT,
AString NVARCHAR(255)
)
CREATE TABLE FKClass
(
ID BIGINT,
AFKInt BIGINT
)
أفكار إضافية
- السمات للتصفية: اعتبر إضافة سمة مخصصة، مثل
[SqlTable]
، إلى فئاتك لضمان تحويل الفئات المعينة فقط إلى جداول. - تحسينات: يمكن تحسين الكود وإعادة هيكلته بشكل أكبر. على سبيل المثال، التعامل مع علاقات المفاتيح الخارجية بسيط للغاية ويمكن أن يستفيد من منطق إضافي.
يوفر هذا الحل نقطة انطلاق قوية لأتمتة توليد جداول SQL بناءً على هياكل فئات C#. نتمنى لك برمجة سعيدة!