ساخت دیتابیس و جداول آن به روش CodeFirst

ساخت database در روش کدفرست در ef core

در روش کدفرست چگونه یک Database ایجاد کنم ؟ در روش  Code First چگونه یک جدول به دیتابیس اضافه کنم ؟

درود ، من آرزو ابراهیمی مدرس دوره اموزش فارسی asp.net core ، با یک مقاله‌ی آموزشی بسیار مفید و کاربردی از فصل اموزش EF Core در خدمت شما دوستان عزیز هستم.

پیش از شروع مطالعه‌ی این مقاله اگر با روش Code Fiest در Entity Framework Core آشنایی ندارید پیشنهاد میکنم مقاله‌ی روش Code First چیست را مطالعه بفرمایید.

ساخت Database و جداول آن در SQL Server به روش Code First در Entity Framework Core

در این مقاله آموزشی میخواهم به صورت گام گام ،ساخت دیتابیس در اسکیوال سرور به روش کدفرست را آموزش دهم پس مراحل زیر را به دقت انجام دهید تا در انتهای این مقاله آموزشی بتوانید به روش Code First یک دیتابیس که شامل یک جدول است در SQL Server ایجاد نمایید.

گام اول : ساخت یک پروژه جدید در ویژوال استودیو

یک پروژه ASP.NET Core ایجاد کنید اگر می‌خواهید یک پروژه با استفاده از الگوی Web Application (Model – View – Controller) ایجاد کنید پیشنهاد می‌کنم مقاله ساخت پروژه در asp core را مطالعه نمایید.

من می‌خواهم یک پروژه با الگوی Empty ایجاد کنیم تا این پروژه شامل موارد اضافه ای که به آنها در این فصل آموزشی نیاز ندارم ، نباشد ، خب پس یک پروژه از نوع الگوی Empty بسازید و برای آن یک نام انتخاب کنید (من نام پروژه خودم را EFCore-C05 قرار دادم اما شما هر نام دلخواهی می‌توانید برای این پروژه قرار دهید)

ایجاد پروژه ASP.NET Core بر اساس الگوی Empty
asp.net core project with empty template

گام دوم : نصب پکیج های لازم EF Core

حالا باید پکیج های مورد نیاز Entity Framework Core را نصب کنید ، پیشنهاد می‌کنم مقاله افزودن EF Core به پروژه را مطالعه نمایید و پکیج‌های ذکر شده در این مقاله‌ی آموزشی را نصب کنید.

گام سوم : مشخص کردن موجودیت ها و تعریف Domian Class ها و پیکربندی آن ها

حالا می‌خواهیم یک Domain Class تعریف کنیم ، فرض کنید که می‌خواهیم یک سامانه‌ی تحت وب پیاده سازی کنیم تا دانشجویان یک دانشگاه ، بتوانند اطلاعات خود را در این سامانه ثبت کنند، پس این سامانه باید این اطلاعات را در یک دیتابیس ذخیره کند . خب به نظرتون پروژه‌ی کوچکی که تعریف کردیم شامل چه موجودیت هایی است؟
خب شاید شما ندونید که موجودیت یا entity اصلا چی هست برای همین ابتدا یک تعریف ساده از موجودیت خدمت شما ارائه میدهم و بعد به سوال بالا پاسخ میدهم.

[box type=”info” align=”alignright” class=”” width=””]

موجوديت یا entity ، فرد ، شیء ، مکان يا مفهومی در سیستم است که می خواهیم اطلاعاتی درباره آن داشته باشیم. هر موجودیت می تواند مجموعه ای از صفات را داشته باشد.

[/box]

در پاسخ سوال فوق باید بگم که در پروژه ای تعریف کردیم موجودیت دانشجو  را داریم. در روش Code First برای هر موجودیت یک Domain Class تعریف می‌کنیم ، پس داخل پروژه یک پوشه به نام Models ایجاد کنید و داخل این پوشه یک کلاس به نام Student برای موجودیت دانشجو بسازید برای این منطور روی پوشه Models راست کلیک کرده سپس گزینه  Add و بعد از آن گزینه Class را از منویی که باز می شود انتخاب کنید. (مطابق تصویر زیر)

افزودن کلاس دامنه به پروژه asp.net core
add domain class in asp.net core project

سپس در پنجره New Item یک نام برای کلاس انتخاب کرده (من نام این کلاس را Student قرار میدهم) و روی Add کلیک کنید تا این کلاس برای شما ساخته شود. (همانند تصویر زیر)

قراردادن نام برای کلاس در پروژه asp.net core
add name for class in asp.net core

همانطور که اشاره کردم ، هر موجودیت یکسری ویژگی یا صفات دارد مثلا از جمله ویژگی های یک دانشجو می توان به شماره دانشجویی ، نام ، نام خانوادگی ، تاریخ تولد و … اشاره کرد حالا در کلاس Student برای هر ویژگی یا صفت دانشجو یک Property تعریف کنیم. به صورت زیر :

public class Student
{
        public string StudentId { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public DateTime BirthDate { get; set; }
}

نکته : برای کدنویسی سریع تر می‌توانید برای تعریف Property عبارت prop را نوشته و دوبار دکمه tab صفحه کلید را فشار دهید.

خب تبریک میگم شما یک Domain Class برای موجودیت دانشجو ایجاد کردید و حالا در روش Code First این کلاس به یک جدول به نام Students تبدیل می‌شود و پراپرتی های این کلاس هم ستون‌های این جدول را تشکیل می‌دهند.

گام چهارم : تعریف کلاس Context

حالا باید یک کلاس Context برای پروژه ایجاد کنیم برای این منظور روی پوشه Models راست کلیک کرده سپس Add و بعد از آن گزینه‌ی Class را انتخاب کنید حالا برای کلاس Context یک نام قرار دهید من نام این کلاس را StudentDBContext قرار میدهم. (شما هر نام دلخواهی که میخواهید می توانید برای این کلاس قرار دهید اما بهتره که نام کلاس به واژه Context ختم شود)

نکته : کلاس Context پروژه کلاسی هست که از کلاس DbContext ارث بری می‌کند پس برای ارث بری این کلاس از DbContext بعد از نام کلاس از علامت : استفاده کرده و سپس نام کلاس DbContext را می‌نویسیم به صورت زیر :

public class StudentDBContext : DbContext
    {
        public StudentDBContext(DbContextOptions options) : base(options)
        {

        }

        public virtual DbSet<Student> Students { set; get; }
    }

حالا باید سازنده کلاس والد را هم صدا بزنیم و پارامترهای موردنیاز این سازنده را به آن پاس دهیم ، برای این منظور در کد بالا یک Constructor یا سازنده برای کلاس StudentDBContext تعریف کردیم.

گام چهارم : تنظیم Connection String یا رشته اتصال در فایل appsettings.json

حالا به سراغ فایل appsettings.json می‌رویم تا connectionString یا رشته اتصال به دیتابیس را تعریف کنید ، کدهای زیر را در فایل appsettings.json خواهد دید :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

کد زیر را به فایل appsettings.json اضافه کنید ، همانطور که در کد زیر مشاهده می‌کنید من نام sqlserver را برای این کانکشن استرینگ قرار دادم ولی شما می‌توانید یک نام دلخواه برای آن قرار دهید.

  "ConnectionStrings": {
    "SqlServer": "Data Source=(local);Initial Catalog=StudentDB;Integrated Security=true"
  },

در کد بالا رشته اتصال را تعریف کردیم ، (دقت کنید که حتما باید SQL Server روی سیستم شما نصب شده باشد) ، مقدار Data Source را (local) یا . قرار دهید تا برنامه به اسکیوال سرور روی سیستم شما متصل شود سپس مقدار Initial Catalog را برابر نام دیتابیسی قرار دهید که میخواهید برای شما در اسکیوال سرور ایجاد شود.

محتویات فایل appsettings.json به صورت زیر خواهد بود :

{
  "ConnectionStrings": {
    "SqlServer": "Data Source=(local);Initial Catalog=StudentDB;Integrated Security=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

گام پنجم : اضافه کردن migration

حالا پنجره Package Manager Console را باز کنید معمولا این پنجره در بخش پایین ویژوال استدیو برای شما باز می شود و برای اضافه کردن یک migration جدید ، دستور add-migration را بنویسید و بعد از این دستور یک نام برای migartion قرار دهید من نام ماگریشن را GenerateDB قرار میدهم ولی شما هر نام دلخواهی می‌توانید برای آن قرار دهید طبق تصویر به صورت زیر :

افزودن migration به پروژه asp.net core
add migration in asp.net core

بعد از وارد کردن دستور add-migration یک پوشه به نام migrations به Solution Explorer اضافه می‌شود که شامل فایل های مربوط به migration است.

پوشه migrations در Solution Explorer
migrations folder in solution explorer in asp.net core

گام ششم : ساخت دیتابیس

حالا در پنجره Package Manager Console دستور update-database را وارد کنید و سپس دکمه enter صفحه کلید را فشار دهید تا دیتابیس StudentDB در اسکیوال سرور برایتان ایجاد شود.

ساخت دیتابیس در روش کدفرست
update-database command in asp.net core

حالا نرم افزار MSSQL را اجرا کنید تا دیتابیس StudentDB را مشاهده کنید همانند تصویر

دیتابیس ایجاد شده در اسکیوال سرور
generated database in sql server

دوستان عزیز این مقاله آموزشی بسیار کاربردی از سری مقالات آموزش تصویری asp net core هم به پایان رسید امیدوارم که از این مقاله آموزشی لذت برده باشید سوالی داشتید حتما مطرح کنید سعی می‌کنم خیلی سریع پاسخگوی شما عزیزان باشم.

 

فیلم آموزشی asp.net core 2

آرزو ابراهیمی
بیش از 6 سال است که زمینه طراحی و توسعه سایت فعالیت می‌کنم، طراح و برنامه نویس انواع سامانه‌های تخصصی پزشکی، مناقصات، فروشگاهی و … بودم و هستم و هدفم در سایت میزفا ارائه اطلاعات بروز و ناب در زمینه طراحی سایت است. تا از این طریق بتونم تجربیات و دانسته های خودم را با تمامی علاقمندان به مباحث طراحی سایت به اشتراک بزارم .

فیلم آموزشی asp.net core 2

45 نظر

45 پاسخ

  1. درود ممنون از مقاله تون من زمانی که میخوام استفاده کنم با این ارور مواجه میشم
    “Object reference not set to an instance of an object”
    چرا؟

  2. سلام میشه بگید چطوری در یک جدول با خودش رابطه برقرار کنیم؟ من parent id گذاشتم و یک پراپرتی ویرچوال برای رابطه با ان براش ایجاد کردم اما نشد اگر کد آن را قرار بدین ممنون میشم مثلا رابطه ی گروه و زیر گروه

  3. سلام من یه مدل دارم که با یه پرائرتی دیکه تو همون کلاس Self related داره به نام parent

    الان باید جدول رو در دیتا بیس با ef بسازم
    میخوام ببینم برای parent هم باید جدول ساخته بشه؟

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

    1. سلام وققتون بخیر
      نیازی به ساخت جدول دیگر نیست
      شما می تونید در جدولتون برای ایجاد رابطه ParentId رو اضافه کنید یعنی در واقع جدول با خودش ارتباط دارد.

  4. سلام.
    دیتا انوتیشن table که بالای کلاس مدل مینویسن برای چیه؟

    1. سلام وقتتون بخیر
      برای نام گذاری جدول در دیتابیس هست زمانی که کلاس شما Employee به یک جدول در دیتابیس map میشه نام اون جدول میشه tblEmployee

  5. بسیار عالی بود. بجای اینکه مانند سایر مقالات گیج کننده باشد بصورت فلوچارتی همه چیز را گفتید. بسیار ممنون

  6. خانم ابراهیمی این مطلب خیلی خوبی بود. باور کنید فایلهای متنی برای مرور سریع خیلی خوب هستند.تشکر میکنیم

    1. سلام وقتتون بخیر
      خوش حالم که این مقاله برای شما رضایت بخش بوده است.
      موفق باشید.

  7. سلام و خسته نباشید خدمت استاد محترم،من یک پروژه Asp.net mvc 5 دارم به روش code First ،محل ذخیره پروژه ام را عوض کنم ،(در sqlبر روی پروژه کلیک راست کردم و از گزینه سمت چپ ،فایل انتخاب و آدرسش درایو c می خواهم تغییرش به درایو های دیگر انتقال دهم ،نمی شود )نظر شما؟
    سوال دوم اینکه،برای باز گردانی اطلاعات در Asp.net code First چگونه انجام می شود؟(پروژه اجرا شد و بانک باز ساخت ،Restore می شود)
    ممنون از آموزش های خوبتون

    1. سلام وقتتون بخیر
      اگر میخواید محل ذخیره دیتابیس رو تغییر بدید اول باید دیتابیس رو Detach کنید بعدش می تونید فایل هاش رو هرجایی که دوست دارید انتقال بدید بعدش دوباره Attach کنید.
      امکان Restore کردن هم در sql server وجود دارد.
      موفق باشید.

  8. سلام و وقت بخیر
    ببخشید یه مشکل برا من پیش اومده هنگام ساخت Migration :
    وقتی Add-Migration را میزنم این ارور را میده همه جا هم سرچ کردم به هیچ جوابی نرسیدم
    Exception has been thrown by the target of an invocation
    ارور را به صورت کامل در فایل پیوست فرستادم
    ممنون میشم راهنماییم کنید چند روزه رو همین مشکل گیر کردنم

    1. سلام وقتتون بخیر
      پیشنهاد میکنم connectionString پروژتون رو چک کنید شاید در این بخش مشکلی وجود داشته باشه که باعث ایجاد خطا میشود.

  9. سلام وقتتون بخیر ممنون بابت اموزش عالیتون.
    من همه ی این مراحلو که فرمودید انجام دادم ولی وقتی add-migration رو مینویسم این خطا رو میده مشکلش چیه؟ خیلی وقته روش وقت گذاشتم ولی درست نشد.اسم کلاسم StoreContext هست.

    PM> add-migration GenerateDB
    Build started…
    Build succeeded.
    Unable to create an object of type ‘StoreContext’. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

    1. سلام ممنونم از لطف شما
      پاسخ سوال شما داده شد.

  10. addmigration میزنم این پیام نشان داده میشه

    Value cannot be null.
    Parameter name: connectionString

    1. سلام وقتتون بخیر
      شما باید ConnectionString یا رشته اتصال را در فایل appSettings.json تعریف کنید .

        1. شما پکیج ها مربوط به EntityFrameworkCore رو نصب کردید؟
          داخل startup.cs کانکشن استرینگ تزریق شده با کد زیر
          services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString(“SqlServer”)));

  11. خیلی خوب و خلاصه جان کلامو رسوندین واقعا عالی بود

    فقط یه سوال دارم این کلاس Dbcontex خالی میمونه ؟ چجوری فیلدارو از مدلم میخونه ؟ خود مدل که فیلدارو داره از dbcontex ارث نبرده
    درسته ؟

    1. سلام وقتتون بخیر ، ممنونم خوش حالم براتون مفید بوده است.
      کلاس مدل یا کلاس Entity در روش CodeFirst باید تبدیل به جداول دیتابیس شوند پس بنابراین برای معرفی این کلاس های Entity همیشه یک کلاس تحت عنوان کلاس Context تعریف میکنیم و این کلاس باید از کلاس پایه DbContext ارث بری کنه ، بعدش باید پراپرتی هایی از نوع DbSet به ازای هر کلاس مدل تعریف کنیم این DbSet ها جداول ما رو میسازند. و فیلدهای جداول هم از پراپرتی های این کلاس ها گرفته میشود.

  12. سلام من یه پروژه ایجاد کردم
    که یک entity property به نام product و یک DBcontext برای اون ایجاد کردم
    وقتی add-migration رو میزنم با این ارور مواجه میشم
    Unable to create an object of type ‘ProductDbContext’. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
    مشکل چی میتونه باشه؟؟؟

    1. سلام وقتتون بخیر
      آیا کلاس ProductDbContext از کلاس DBContext ارث بری میکند؟

      1. سلام خانم ابراهیمی من هم همین مشکل رو دارم و نمیدونم چرا درست نمیشه. از کلاس DBContext هم ارث بری میکنه

          1. با سلام
            با تشکر از اموزش بسیار عالیتون
            من همین مشکلو داشتم اینطوری حل شد که چون dbcontext توی یه لایه ی دیگه بود هنگام اجرا باید لایه ای که startup داخلش قرار داره رو در قسمت solution startup كنار debug در تولبار بالای صفحه انتخاب کنم.

          2. سلام … خواهش میکنم
            ممنونم که تجربیات خودتون رو با ما به اشتراک گذاشتید.

  13. با سلام
    من یک برنامه ویندوزی نوشتم که دیتابیس اون تکمیل هست
    حالا همون میخوام برنامه وبی کنم
    ایا راهی هست بدون ساختن جداول (چون از قبل امادس) فقط از اون ها استفاده کنم؟

      1. سلام وقت تون بخیر سرکار خانم ارزو ابراهیمی
        خواستم بپرسم ایا برنامه ای برای اپدیت کردن دوره asp.net core 2 خود دارید؟؟
        الان ورژن 5 هم اومده

        1. سلام وقتتون بخیر
          فعلا برنامه ای برای آپدیت دوره نداریم.

  14. سلام عرض ادب
    من یک پروژه حسابداری با تکنولوژی entity faram work نوشتم فقط یک مشکلی که دارم اتصال با دیتا بیس هستش یعنی اینکه برنامه من بعد نشر در کامپیوتر مشتری اتصال با دیتا بیس رو از دست میده راهی هست که بدون اسکیو ال سرور به دیتا بیس وصل بشیم ممنون میشم

    1. سلام وقتتون بخیر
      پروژتون تحت وب هست یا ویندوز ؟

  15. سلام ممنون از زحماتتون
    من همه مراحل رو طبق آموزش پیش رفتم ولی در کلاسی که درست کردم خطای زیر رو می دهد
    Severity Code Description Project File Line Suppression State
    Error CS0305 Using the generic type ‘DbSet’ requires 1 type arguments WebApplication1 D:\Lening MVC Core\MVC Core\2\WebApplication1\WebApplication1\Models\PeopleDbContext.cs 16 Active

    کلاس من به این شکل است

    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;

    namespace WebApplication1.Models
    {
    public class PeopleDbContext: DbContext
    {
    public PeopleDbContext(DbContextOptions options) : base(options)
    {

    }

    public virtual DbSet People { set; get; }
    }
    }
    ممنون میشم جواب را برای من میل فرمائید ممنون از زحمات شما

    1. سلام وقتتون بخیر
      از کلاس DbSet به صورت جنریک باید استفاده بشه به صورت زیر
      DbSet<Student>

  16. با سلام و وقت بخیر.
    من از اس کیو ال ۲۰۱۶ استفاده میکنم.تا مرحله اخر میرم.حتی migrationهم درست میشه و ارور ندارم.ولی وقتی update-database رو میزنم ارور میده که سورس ساپورت نمیشه
    (not surce sopart)و پایگاه دادم درست نمیشه.
    تشکر.

    1. سلام وقتتون بخیر
      پروژتون از نوع asp.net core هست؟
      کانکشن استرینگ رو درست تنظیم کردید ؟

      1. با سلام خدمتتون و تشکر بابت پاسخگوییتون.
        بله aspcore2 و تمام مراحل رو طبق دستور طی کردم ولی ارور میزنه.جالب اینجاس قبلا استفاده کردم و ارور نداشتم.ولی ویندوز رو عوض کردم واستارت پروژه رو زدم به این مشکل خوردم.

        1. سلام وقتتون بخیر
          نسخه ویژوالتون رو بعد عوض کردن ویندوز ارتقا دادید؟
          شاید بعد از نصب نسخه ورژن بالاتر این مشکل بوجود آمده است.

  17. سلام من وقتی add-migration میزنم این خطا رو دریاف میکنم مشکل از چیه کلافه کرده
    No DbContext was found in assembly ‘MyCms.Web’. Ensure that you’re using the correct assembly and that the type is neither abstract nor generic

    1. سلام
      شما کلاس Context رو در پروژتون تعریف کردید ؟
      کلاسی که باید از کلاس DbContext ارث بری کنه

  18. سلام
    ممنون بابت آموزش هاتون
    من می خواهم برا پروژه دو تا دیتابیس ایجاد کنم
    یکی برای اطلاعات پروژه
    دیگری برای ذخیره تصاویر در خود sql
    ممنون میشم راهنمایی کنید چطور عمل کنم
    خودم نوشتم ولی موقع اضافه کردن migration به Dbcontext خطا گرفت

    1. سلام وقت بخیر
      داخل کلاستون نوع پراپرتی را به صورت زیر قرار بدید
      [Column(TypeName ="image")]
      public byte[] Image { get; set; }

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

حداکثر حجم فایل برای آپلود: 1 مگابایت. فایل‌های مجاز برای آپلود: عکس, ویس, ویدیو, ورد یا پی دی اف, فایل متنی, زیپ. شما می‌تونید برای بهتر پرسیدن سوالتون، عکس یا ویس یا حتی فیلم در بخش نظرات میزفا آپلود کنید. برای ضبط ویس می‌تونید از خود واتس آپ استفاده کنید و بعد اینجا آپلود کنید و برای ارسال عکس هم کافی هست اسکرین شات بگیرید. Drop file here

با موفقیت ثبت شد، میزفا از شما برای عضویت در خبرنامه هفتگی تشکر میکند.

عضویت در خبرنامه هفتگی برای دریافت:

  • فیلم و مقاله رایگان سئو
  • آموزش‌های UX ، GA و GTM
  • مقاله های تخصصی ASP.NET Core
  • اطلاع رسانی از محصولات
فیلم آموزشی asp.net core 2
ترک میزفا خوب نیست!
معرفی جامع‌ترین ابزار سئو در ایران
بالای ۱۰ هزار عضو
PHZpZGVvIHdpZHRoPSI2MDAiIGhlaWdodD0iMzUwIiBwb3N0ZXI9Imh0dHBzOi8vbWl6ZmEuY29tL2Jsb2cvd3AtY29udGVudC91cGxvYWRzLzIwMjMvMDUvcG9zdGVyLW1pemZhLXRvb2xzLXZpZGVvLW1pbi5wbmciIGNvbnRyb2xzIHByZWxvYWQ9Im5vbmUiPiANCiAgIDxzb3VyY2Ugc3JjPSJodHRwczovL21pemZhLmNvbS9ibG9nL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIzLzA1L21pemZhX3Rvb2xzXzcyMHAubXA0IiB0eXBlPSJ2aWRlby9tcDQiPg0KPC92aWRlbz4=