در روش کدفرست چگونه یک Database ایجاد کنم ؟ در روش Code First چگونه یک جدول به دیتابیس اضافه کنم ؟
درود ، من آرزو ابراهیمی مدرس دوره اموزش فارسی asp.net core ، با یک مقالهی آموزشی بسیار مفید و کاربردی از فصل اموزش EF Core در خدمت شما دوستان عزیز هستم.
پیش از شروع مطالعهی این مقاله اگر با روش Code Fiest در Entity Framework Core آشنایی ندارید پیشنهاد میکنم مقالهی روش Code First چیست را مطالعه بفرمایید.
سرفصلهای پست
- 1 ساخت Database و جداول آن در SQL Server به روش Code First در Entity Framework Core
- 1.1 گام اول : ساخت یک پروژه جدید در ویژوال استودیو
- 1.2 گام دوم : نصب پکیج های لازم EF Core
- 1.3 گام سوم : مشخص کردن موجودیت ها و تعریف Domian Class ها و پیکربندی آن ها
- 1.4 گام چهارم : تعریف کلاس Context
- 1.5 گام چهارم : تنظیم Connection String یا رشته اتصال در فایل appsettings.json
- 1.6 گام پنجم : اضافه کردن migration
- 1.7 گام ششم : ساخت دیتابیس
ساخت 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 قرار دادم اما شما هر نام دلخواهی میتوانید برای این پروژه قرار دهید)
گام دوم : نصب پکیج های لازم EF Core
حالا باید پکیج های مورد نیاز Entity Framework Core را نصب کنید ، پیشنهاد میکنم مقاله افزودن EF Core به پروژه را مطالعه نمایید و پکیجهای ذکر شده در این مقالهی آموزشی را نصب کنید.
گام سوم : مشخص کردن موجودیت ها و تعریف Domian Class ها و پیکربندی آن ها
حالا میخواهیم یک Domain Class تعریف کنیم ، فرض کنید که میخواهیم یک سامانهی تحت وب پیاده سازی کنیم تا دانشجویان یک دانشگاه ، بتوانند اطلاعات خود را در این سامانه ثبت کنند، پس این سامانه باید این اطلاعات را در یک دیتابیس ذخیره کند . خب به نظرتون پروژهی کوچکی که تعریف کردیم شامل چه موجودیت هایی است؟
خب شاید شما ندونید که موجودیت یا entity اصلا چی هست برای همین ابتدا یک تعریف ساده از موجودیت خدمت شما ارائه میدهم و بعد به سوال بالا پاسخ میدهم.
موجوديت یا entity ، فرد ، شیء ، مکان يا مفهومی در سیستم است که می خواهیم اطلاعاتی درباره آن داشته باشیم. هر موجودیت می تواند مجموعه ای از صفات را داشته باشد.
[/box]در پاسخ سوال فوق باید بگم که در پروژه ای تعریف کردیم موجودیت دانشجو را داریم. در روش Code First برای هر موجودیت یک Domain Class تعریف میکنیم ، پس داخل پروژه یک پوشه به نام Models ایجاد کنید و داخل این پوشه یک کلاس به نام Student برای موجودیت دانشجو بسازید برای این منطور روی پوشه Models راست کلیک کرده سپس گزینه Add و بعد از آن گزینه Class را از منویی که باز می شود انتخاب کنید. (مطابق تصویر زیر)
سپس در پنجره New Item یک نام برای کلاس انتخاب کرده (من نام این کلاس را Student قرار میدهم) و روی Add کلیک کنید تا این کلاس برای شما ساخته شود. (همانند تصویر زیر)
همانطور که اشاره کردم ، هر موجودیت یکسری ویژگی یا صفات دارد مثلا از جمله ویژگی های یک دانشجو می توان به شماره دانشجویی ، نام ، نام خانوادگی ، تاریخ تولد و … اشاره کرد حالا در کلاس 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 قرار میدهم ولی شما هر نام دلخواهی میتوانید برای آن قرار دهید طبق تصویر به صورت زیر :
بعد از وارد کردن دستور add-migration یک پوشه به نام migrations به Solution Explorer اضافه میشود که شامل فایل های مربوط به migration است.
گام ششم : ساخت دیتابیس
حالا در پنجره Package Manager Console دستور update-database را وارد کنید و سپس دکمه enter صفحه کلید را فشار دهید تا دیتابیس StudentDB در اسکیوال سرور برایتان ایجاد شود.
حالا نرم افزار MSSQL را اجرا کنید تا دیتابیس StudentDB را مشاهده کنید همانند تصویر
دوستان عزیز این مقاله آموزشی بسیار کاربردی از سری مقالات آموزش تصویری asp net core هم به پایان رسید امیدوارم که از این مقاله آموزشی لذت برده باشید سوالی داشتید حتما مطرح کنید سعی میکنم خیلی سریع پاسخگوی شما عزیزان باشم.
45 پاسخ
درود ممنون از مقاله تون من زمانی که میخوام استفاده کنم با این ارور مواجه میشم
“Object reference not set to an instance of an object”
چرا؟
سلام میشه بگید چطوری در یک جدول با خودش رابطه برقرار کنیم؟ من parent id گذاشتم و یک پراپرتی ویرچوال برای رابطه با ان براش ایجاد کردم اما نشد اگر کد آن را قرار بدین ممنون میشم مثلا رابطه ی گروه و زیر گروه
سلام من یه مدل دارم که با یه پرائرتی دیکه تو همون کلاس Self related داره به نام parent
الان باید جدول رو در دیتا بیس با ef بسازم
میخوام ببینم برای parent هم باید جدول ساخته بشه؟
اینها برای ساخت دسته بندی و زیر گروههای اون توی سایته
سلام وققتون بخیر
نیازی به ساخت جدول دیگر نیست
شما می تونید در جدولتون برای ایجاد رابطه ParentId رو اضافه کنید یعنی در واقع جدول با خودش ارتباط دارد.
سلام.
دیتا انوتیشن table که بالای کلاس مدل مینویسن برای چیه؟
سلام وقتتون بخیر
برای نام گذاری جدول در دیتابیس هست زمانی که کلاس شما Employee به یک جدول در دیتابیس map میشه نام اون جدول میشه tblEmployee
بسیار عالی بود. بجای اینکه مانند سایر مقالات گیج کننده باشد بصورت فلوچارتی همه چیز را گفتید. بسیار ممنون
سلام وقت بخیر
تشکر از حضور شما
خانم ابراهیمی این مطلب خیلی خوبی بود. باور کنید فایلهای متنی برای مرور سریع خیلی خوب هستند.تشکر میکنیم
سلام وقتتون بخیر
خوش حالم که این مقاله برای شما رضایت بخش بوده است.
موفق باشید.
سلام و خسته نباشید خدمت استاد محترم،من یک پروژه Asp.net mvc 5 دارم به روش code First ،محل ذخیره پروژه ام را عوض کنم ،(در sqlبر روی پروژه کلیک راست کردم و از گزینه سمت چپ ،فایل انتخاب و آدرسش درایو c می خواهم تغییرش به درایو های دیگر انتقال دهم ،نمی شود )نظر شما؟
سوال دوم اینکه،برای باز گردانی اطلاعات در Asp.net code First چگونه انجام می شود؟(پروژه اجرا شد و بانک باز ساخت ،Restore می شود)
ممنون از آموزش های خوبتون
سلام وقتتون بخیر
اگر میخواید محل ذخیره دیتابیس رو تغییر بدید اول باید دیتابیس رو Detach کنید بعدش می تونید فایل هاش رو هرجایی که دوست دارید انتقال بدید بعدش دوباره Attach کنید.
امکان Restore کردن هم در sql server وجود دارد.
موفق باشید.
درود ، خیلی ممنون،لطف کردید.سپاس
سلام و وقت بخیر
ببخشید یه مشکل برا من پیش اومده هنگام ساخت Migration :
وقتی Add-Migration را میزنم این ارور را میده همه جا هم سرچ کردم به هیچ جوابی نرسیدم
Exception has been thrown by the target of an invocation
ارور را به صورت کامل در فایل پیوست فرستادم
ممنون میشم راهنماییم کنید چند روزه رو همین مشکل گیر کردنم
سلام وقتتون بخیر
پیشنهاد میکنم connectionString پروژتون رو چک کنید شاید در این بخش مشکلی وجود داشته باشه که باعث ایجاد خطا میشود.
سلام وقتتون بخیر ممنون بابت اموزش عالیتون.
من همه ی این مراحلو که فرمودید انجام دادم ولی وقتی 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
سلام ممنونم از لطف شما
پاسخ سوال شما داده شد.
addmigration میزنم این پیام نشان داده میشه
Value cannot be null.
Parameter name: connectionString
سلام وقتتون بخیر
شما باید ConnectionString یا رشته اتصال را در فایل appSettings.json تعریف کنید .
تعریف شده ولی هنوز همین پیام میاد
شما پکیج ها مربوط به EntityFrameworkCore رو نصب کردید؟(options => options.UseSqlServer(Configuration.GetConnectionString(“SqlServer”)));
داخل startup.cs کانکشن استرینگ تزریق شده با کد زیر
services.AddDbContext
خیلی خوب و خلاصه جان کلامو رسوندین واقعا عالی بود
فقط یه سوال دارم این کلاس Dbcontex خالی میمونه ؟ چجوری فیلدارو از مدلم میخونه ؟ خود مدل که فیلدارو داره از dbcontex ارث نبرده
درسته ؟
سلام وقتتون بخیر ، ممنونم خوش حالم براتون مفید بوده است.
کلاس مدل یا کلاس Entity در روش CodeFirst باید تبدیل به جداول دیتابیس شوند پس بنابراین برای معرفی این کلاس های Entity همیشه یک کلاس تحت عنوان کلاس Context تعریف میکنیم و این کلاس باید از کلاس پایه DbContext ارث بری کنه ، بعدش باید پراپرتی هایی از نوع DbSet به ازای هر کلاس مدل تعریف کنیم این DbSet ها جداول ما رو میسازند. و فیلدهای جداول هم از پراپرتی های این کلاس ها گرفته میشود.
سلام من یه پروژه ایجاد کردم
که یک 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
مشکل چی میتونه باشه؟؟؟
سلام وقتتون بخیر
آیا کلاس ProductDbContext از کلاس DBContext ارث بری میکند؟
سلام خانم ابراهیمی من هم همین مشکل رو دارم و نمیدونم چرا درست نمیشه. از کلاس DBContext هم ارث بری میکنه
سلام وقتتون بخیر
من خطایی مه شما با آن مواجه شدید رو سرچ کردملینک زیر می تونه به شما کمک کنه راه حل پیشنهاد داده شده می تونید تست کنید.
https://entityframeworkcore.com/knowledge-base/56363374/-error-unable-to-create-an-object-of-type–appdbcontext—for-the-different-patterns-supported-at-design-time-
با سلام
با تشکر از اموزش بسیار عالیتون
من همین مشکلو داشتم اینطوری حل شد که چون dbcontext توی یه لایه ی دیگه بود هنگام اجرا باید لایه ای که startup داخلش قرار داره رو در قسمت solution startup كنار debug در تولبار بالای صفحه انتخاب کنم.
سلام … خواهش میکنم
ممنونم که تجربیات خودتون رو با ما به اشتراک گذاشتید.
با سلام
من یک برنامه ویندوزی نوشتم که دیتابیس اون تکمیل هست
حالا همون میخوام برنامه وبی کنم
ایا راهی هست بدون ساختن جداول (چون از قبل امادس) فقط از اون ها استفاده کنم؟
سلام وقتتون بخیر
اگر از asp.net core استفاده می کنید می تونید از روش database first که اموزش دادم استفاده کنید.
سلام وقت تون بخیر سرکار خانم ارزو ابراهیمی
خواستم بپرسم ایا برنامه ای برای اپدیت کردن دوره asp.net core 2 خود دارید؟؟
الان ورژن 5 هم اومده
سلام وقتتون بخیر
فعلا برنامه ای برای آپدیت دوره نداریم.
سلام عرض ادب
من یک پروژه حسابداری با تکنولوژی entity faram work نوشتم فقط یک مشکلی که دارم اتصال با دیتا بیس هستش یعنی اینکه برنامه من بعد نشر در کامپیوتر مشتری اتصال با دیتا بیس رو از دست میده راهی هست که بدون اسکیو ال سرور به دیتا بیس وصل بشیم ممنون میشم
سلام وقتتون بخیر
پروژتون تحت وب هست یا ویندوز ؟
سلام ممنون از زحماتتون
من همه مراحل رو طبق آموزش پیش رفتم ولی در کلاسی که درست کردم خطای زیر رو می دهد
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; }
}
}
ممنون میشم جواب را برای من میل فرمائید ممنون از زحمات شما
سلام وقتتون بخیر
از کلاس DbSet به صورت جنریک باید استفاده بشه به صورت زیر
DbSet<Student>
با سلام و وقت بخیر.
من از اس کیو ال ۲۰۱۶ استفاده میکنم.تا مرحله اخر میرم.حتی migrationهم درست میشه و ارور ندارم.ولی وقتی update-database رو میزنم ارور میده که سورس ساپورت نمیشه
(not surce sopart)و پایگاه دادم درست نمیشه.
تشکر.
سلام وقتتون بخیر
پروژتون از نوع asp.net core هست؟
کانکشن استرینگ رو درست تنظیم کردید ؟
با سلام خدمتتون و تشکر بابت پاسخگوییتون.
بله aspcore2 و تمام مراحل رو طبق دستور طی کردم ولی ارور میزنه.جالب اینجاس قبلا استفاده کردم و ارور نداشتم.ولی ویندوز رو عوض کردم واستارت پروژه رو زدم به این مشکل خوردم.
سلام وقتتون بخیر
نسخه ویژوالتون رو بعد عوض کردن ویندوز ارتقا دادید؟
شاید بعد از نصب نسخه ورژن بالاتر این مشکل بوجود آمده است.
سلام من وقتی 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
سلام
شما کلاس Context رو در پروژتون تعریف کردید ؟
کلاسی که باید از کلاس DbContext ارث بری کنه
سلام
ممنون بابت آموزش هاتون
من می خواهم برا پروژه دو تا دیتابیس ایجاد کنم
یکی برای اطلاعات پروژه
دیگری برای ذخیره تصاویر در خود sql
ممنون میشم راهنمایی کنید چطور عمل کنم
خودم نوشتم ولی موقع اضافه کردن migration به Dbcontext خطا گرفت
سلام وقت بخیر
داخل کلاستون نوع پراپرتی را به صورت زیر قرار بدید
[Column(TypeName ="image")]
public byte[] Image { get; set; }