ویرگول
ورودثبت نام
سید عمید قائم مقامی
سید عمید قائم مقامیبرنامه نویسی سیستم ویندوز و مهندسی معکوس و علاقه مند به آموزش.
سید عمید قائم مقامی
سید عمید قائم مقامی
خواندن ۵ دقیقه·۱ روز پیش

SQLite در سیشارپ

قصد داریم دیتابیس SQLite رو با هم در ویژوال استدیو ساخته و استفاده کنیم. در ابتدا یک پروژه کنسول اپلیکیشن در سیشارپ میسازیم.(با انتیتی فریمورک)

برای ساخت و مدیریت دیتابیس ابتدا Nuget های زیر رو نصب میکنیم.(ورژنها باید مطابق ورژن .net باشن)

(توی سولوشن پروژه روی اسم پروژه کلیک راست میکنیم نوشته Manage Nuget Package Manager)

Microsoft.EntityFrameworkCore.Sqlite Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore

حالا برا این که ساختار پروژه تمیز باشه توی سولوشن یک فولدر ایجاد میکنیم و اسمش میزاریم Models

اول باید مدل بسازیم:

حالا فرض میکنیم ما چندین تا موجودیت داریم مثلا یه جدول میخوایم بسازیم به اسم User که قراره اطلاعات کاربران داخلش باشه

مثلا میگیم کاربر چندین تا ویژگی داره مثلا ؟

  • آیدی

  • نام کاربری

حالا برای هر کدوم از این ها یه پراپرتی قرار میدیم:(یک کلاس با اسم User میسازیم و پراپرتی هارو درون آن مینویسیم)

public int UserID{get;set;} public string UserName{get;set;}

همانند شکل زیر:

فرض میکنیم میخوایم همین مدل رو ببریم توی دیتابیس

حالا برای این که بخوایم روابط رو مشخص کنیم و کلا تنظیمات انجام بدیم باید یه کاری انجام بدیم و اونم اینه که برای این که استاندارد رو رعایت کرده باشیم یه پوشه جدید میسازیم به اسم Data یه کلاس داخلش ایجاد میکنیم(مثلا با نام AppDbContext).

AppDbContext واسطه بین ما و دیتابیس میشه و ما اونجا مشخص میکنیم کدوم یک از جداول با هم ارتباط دارن.(سطح دسترسی رو پابلیک قرار میدیم)

AppDbContext باید از DbContext ارث بری کند.

کانستراکتور ایجاد میکنیم:

public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

حالا این کانستراکتور چیکار میکند؟ و توی <AppDbContext> گفتیم ینی تنظیماتی که بهت میدیم اینجاست و با این کلاس تعامل داری و یک متغیر گذاشتیم به اسم options

دقیقا options کارش چی هست؟

وظیفش اینه ارتباط ها رو مدیریت کنه مثلا:

رشته اتصال ما ( این که به کدوم دیتابیس و کدوم سرور وصل شه،آیا روش احراز هویتی چیزی وجود داره یا خیر)

و اون base(options); هم تنظیماتی که انجام میده رو میفرسته به والد خودش ینی همون DbContext

حالا بعد از این که این ایجاد شد چیکار میکنیم؟ باید مشخص کنیم چطوری مدل هامون با هم ارتباط برقرار کنن

حالا باید از یک متد استفاده کنیم

متد OnModelCreateing اون متدی هست که ما ارتباط ها رو مشخص میکنیم که کدوم جداول به هم وصل هستن.

برای ایجاد کردنش می نویسیم override و بعد یک اسپیس میزنیم (اینتلی سنس ویژوال استودیو متدهایی رو بهت پیشنهاد میده و از اون لیست OnModelCreating رو انتخاب میکنی)

(چیزی که داخل متد هست رو پاکش نکنید)حالا اینجا روابط رو مشخص میکنید. یه مدل دیگه هم میسازیم.

یه کلاس دیگه بسازید با نام Post میسازیم و درونش مقادیر زیر را وارد میکنیم.

public class Post { public int Id { get; set; } public string Title { get; set; } public string Body { get; set; } // کلید خارجی public int UserId { get; set; } // ویژگی ناوبری (Navigation Property) public User Author { get; set; } }

شاید براتون سوال بشه چرا توی آخرین پراپرتی اسم کلاس اومده؟

چون ما داریم میگیم هر پست از کاربران مربوط به یک کلاس کاربر هست که اسمش گذاشتیم Author


برمیگردیم به فایل AppDbContext:

حالا توی همون متد OnModelCreating اون چیزی که خودش نوشته رو پاک نکنید بیاید یه خط پایین تر.

modelBuilder.Entity<Post>() .HasOne(p => p.Author) // هر پست یک نویسنده دارد .WithMany(u => u.Posts) // هر نویسنده چندین پست دارد .HasForeignKey(p => p.UserId); // کلید خارجی این است

اونجا که نوشته modelBuilder اون ابزاری هست که ما میگیم میخوایم روی این مدل چه کاری انجام میدیم


برای ساخت دیتابیس ما زمانی که میخوایم دیتابیس ایجاد کنیم میگریشن (Migration) انجام میدیم.

حالا کار بعدی ما اینه که یه رشته اتصال مشخص کنیم:

توی پروژه های اِی اِس پی ما میتونستیم مشخص کنیم توی یه فایلی به اسم appsettnigs.json اما از اونجایی که ما روی کنسول کار میکنیم برمیگردیم به فایل AppDbContext

حالا مثل اون OnModelCreating اینبار یه متد دیگه رو روش کار میکنیم اسمش هست: OnConfiguring

مدل عکس زیر اون رو درست میکنیم:


حالا در مرحله بعدی مایگریشن میزنیم: مایگریشن کارش چیه؟ ناسازگاری بین ابزارهای مختلف مثل زبان برنامه نویسی و دیتابیس رو حلش میکنه.

پیش از اون باید مشخص کنیم دیتابیس ها رو به وسیله کلاس DbSet این کار انجام میدیم:

public DbSet<Post> Posts { get; set; } public DbSet<User> User { get; set; }

دی بی ست نماینده اون مدل ما هست که با دیتابیس ارتباط داره.

باید پایین کانستراکتور باشه تا استاندارد رعایت بشه

برای مایگریشن طبق عکس زیر رفتار میکنیم:

حالا اون کنسول که براتون باز شد این رو بزنید:

Add-Migration InitialCreate

حروف کوچیک بزرگ چندان تاثیری نداره ولی اگر ساختار رعایت شه قشنگ تره , اون InitialCreate هم اسم اون مایگریشن ما هست و دلخواه هم هست ولی معمولا اولین مایگریشن رو این شکلی می نویسن


اگر ارور به ارور زیر برخورد کردین یک کانستراکتور خالی در AppDbContext بسازید

public AppDbContext() { }

و این رو اضافه کنید(قبلی رو پاک کنید)

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlite("Data Source=MyDatabase.db"); } }

مانند تصویر زیر:

اگر همه چیز رو درست انجام داده باشین یک دیتابیس در پنجره سلوشن اکسپلورر ظاهر میشود. مانند عکس زیر:


خب حالا برای این که جداول ما ایجاد بشن اینبار این دستور رو هم میزنیم

Update-Database

الان دیگه جداول ما ایجاد میشن.خروجی کنسول باید مطابق عکس زیر باشد:

کد زیر رو برای تست دیتابیس در فایل اصلی برنامه مینویسیم

using SQLite001.Models; using Microsoft.EntityFrameworkCore; using SQLite001; using SQLite001.Models; Console.WriteLine("--- سیستم مدیریت محتوا (تمرینی) ---"); using (var context = new AppDbContext()) { // ۱. اطمینان از اینکه دیتابیس ساخته شده (اختیاری اگر میگریشن زدید) context.Database.EnsureCreated(); // ۲. ایجاد یک کاربر جدید if (!context.User.Any()) // اگر کاربری نبود بساز { var newUser = new User { UserName = "Hassan_Dev" }; context.User.Add(newUser); context.SaveChanges(); // ذخیره در دیتابیس Console.WriteLine($"کاربر '{newUser.UserName}' با موفقیت ساخته شد."); } // ۳. اضافه کردن پست برای اولین کاربر var user = context.User.First(); var newPost = new Post { Title = "اولین تجربه دات‌نت", Body = "من امروز کار با SQLite و EF Core را یاد گرفتم!", UserId = user.UserID // اتصال پست به کاربر }; context.Posts.Add(newPost); context.SaveChanges(); Console.WriteLine("پست جدید با موفقیت ثبت شد."); // ۴. نمایش اطلاعات (Reading) Console.WriteLine("\n--- لیست تمامی پست‌ها به همراه نویسنده ---"); var allPosts = context.Posts .Include(p => p.Author) // بارگذاری اطلاعات نویسنده (همان Navigation Property) .ToList(); foreach (var p in allPosts) { Console.WriteLine($"عنوان: {p.Title} | نویسنده: {p.Author.UserName}"); } } Console.WriteLine("\nعملیات با موفقیت به پایان رسید. کلیدی را برای خروج فشار دهید..."); Console.ReadKey();

توجه: در دات نت چندین دیتابیس ساخته میشود که دیتابیس موجود در آدرس زیر دیتابیس صحیح ما میباشد.

از SQLite Expert Professional میتونید محتویات دیتابیس خودتون رو ببینید.

Telegram: @CaKeegan
Gmail : amidgm2020@gmail.com

sqliteسی‌شارپدیتابیس
۳
۰
سید عمید قائم مقامی
سید عمید قائم مقامی
برنامه نویسی سیستم ویندوز و مهندسی معکوس و علاقه مند به آموزش.
شاید از این پست‌ها خوشتان بیاید