یک مثال کامل از یک برنامه کنسول سی شارپ با استفاده از Entity Framework Core ایجاد کنیم. این برنامه یک پایگاهداده ساده برای مدیریت کتابها خواهد داشت.
1. ایجاد پروژه کنسولابتدا یک پروژه کنسول جدید در Visual Studio ایجاد کنید.
2. نصب پکیجهای مورد نیازدر Package Manager Console، دستورات زیر را اجرا کنید تا پکیجهای Entity Framework Core نصب شوند:
Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
3. تعریف مدل دادهاییک کلاس برای مدل دادهای کتابها ایجاد کنید:
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public int Year { get; set; }
}
4. ایجاد کلاس Contextیک کلاس برای مدیریت ارتباط با پایگاهداده ایجاد کنید:
public class LibraryContext : DbContext
{
public DbSet<Book> Books { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("YourConnectionStringHere");
}
}
5. انجام عملیات CRUD در برنامه کنسولدر فایل Program.cs، کد زیر را اضافه کنید تا عملیات CRUD را انجام دهید:
using System;
using System.Linq;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (var context = new LibraryContext())
{
// اضافه کردن یک کتاب جدید
var book = new Book
{
Title = "The Great Gatsby",
Author = "F. Scott Fitzgerald",
Year = 1925
};
context.Books.Add(book);
context.SaveChanges();
// خواندن دادهها
var books = context.Books.ToList();
Console.WriteLine("Books in the library:");
foreach (var b in books)
{
Console.WriteLine($"{b.Title} by {b.Author}");
}
// بهروزرسانی دادهها
var bookToUpdate = context.Books.FirstOrDefault(b => b.Id == book.Id);
if (bookToUpdate != null)
{
bookToUpdate.Title = "The Great Gatsby (Updated)";
context.SaveChanges();
}
// حذف دادهها
var bookToDelete = context.Books.FirstOrDefault(b => b.Id == book.Id);
if (bookToDelete != null)
{
context.Books.Remove(bookToDelete);
context.SaveChanges();
}
}
}
}
}
6. تنظیم Connection Stringدر کلاس LibraryContext، رشته اتصال (Connection String) را با اطلاعات پایگاهداده خود جایگزین کنید:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=your_server;Database=your_database;Trusted_Connection=True;");
}
7. اجرای برنامهحالا میتوانید برنامه را اجرا کنید. این برنامه ابتدا یک کتاب جدید اضافه میکند، سپس لیست کتابها را نمایش میدهد، کتاب را بهروزرسانی میکند و در نهایت آن را حذف میکند.
این یک مثال کامل از نحوه استفاده از Entity Framework Core در یک برنامه کنسول سی شارپ بود.
این کد شامل دو بخش اصلی است: ایجاد و پر کردن یک پایگاه داده SQL و سپس استفاده از Entity Framework در C# برای دسترسی به دادهها. بیایید هر بخش را توضیح دهیم:
1. ایجاد و پر کردن پایگاه داده SQL
CREATE DATABASE People_DB;
GO
USE People_DB;
GO
CREATE TABLE People (
PersonID int IDENTITY(1,1) PRIMARY KEY,
FirstName nvarchar(50) NOT NULL,
LastName nvarchar(50) NOT NULL,
Age int NOT NULL
);
GO
INSERT INTO People (FirstName, LastName, Age)
VALUES ('Ali', 'Rezai', 32), ('Mohammad', 'Naseri', 24), ('Hasan', 'Karimi', 55);
GO
- CREATE DATABASE People_DB;:
یک پایگاه داده جدید به نام People_DB ایجاد میکند.
- USE People_DB;:
پایگاه داده People_DB را برای استفاده انتخاب میکند.
- CREATE TABLE People (...);:
یک جدول به نام People با ستونهای PersonID, FirstName, LastName, و Age ایجاد میکند. PersonID به صورت خودکار افزایش مییابد و کلید اصلی است.
- INSERT INTO People (...);:
سه رکورد به جدول People اضافه میکند.
2. استفاده از Entity Framework در C#
People_DBEntities dB = new People_DBEntities();
var list = dB.People.ToList();
foreach (var item in list)
{
Console.WriteLine($"PersonID: {item.PersonID}, Name: {item.FirstName}, Family: {item.LastName}, Age: {item.Age}");
}
Console.ReadKey();
- People_DBEntities dB = new People_DBEntities();:
یک شیء از نوع People_DBEntities ایجاد میکند که نمایانگر پایگاه داده است.
- var list = dB.People.ToList();:
تمام رکوردهای جدول People را به صورت لیست بازیابی میکند.
- foreach (var item in list) {...}:
هر رکورد را در لیست پیمایش کرده و اطلاعات آن را چاپ میکند.
این کد به شما اجازه میدهد تا دادههای موجود در پایگاه داده را با استفاده از Entity Framework در C# بازیابی و نمایش دهید.
برای نصب Entity Framework، میتوانید از روشهای مختلفی استفاده کنید. در اینجا دو روش رایج برای نصب Entity Framework Core و Entity Framework 6 را توضیح میدهم:
نصب Entity Framework Core- با استفاده از .NET CLI:
- ابتدا مطمئن شوید که .NET SDK نصب شده است.
- سپس دستور زیر را در خط فرمان اجرا کنید:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
- این دستور بسته NuGet مربوط به SQL Server را نصب میکند. میتوانید نسخه خاصی را با استفاده از -v مشخص کنید، مثلاً:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer -v 6.0.14
- با استفاده از Visual Studio:
- از منوی Visual Studio، گزینه Project > Manage NuGet Packages را انتخاب کنید.
- در تب Browse، بسته Microsoft.EntityFrameworkCore.SqlServer را جستجو و نصب کنید.
نصب Entity Framework 6- با استفاده از Package Manager Console:
- از منوی Visual Studio، گزینه Tools > NuGet Package Manager > Package Manager Console را انتخاب کنید.
- دستور زیر را در کنسول اجرا کنید:
Install-Package EntityFramework
- برای نصب نسخه خاصی، از -Version استفاده کنید، مثلاً:
Install-Package EntityFramework -Version 6.2.0
- با استفاده از Manage NuGet Packages:
- از منوی Visual Studio، گزینه Project > Manage NuGet Packages را انتخاب کنید.
- در تب Browse، بسته EntityFramework را جستجو و نصب کنید.
این روشها به شما کمک میکنند تا Entity Framework را به پروژه خود اضافه کنید و از آن برای دسترسی به دادهها استفاده کنید.
4.8M حجم رسانه بالاست
مشاهده در ایتا
اضافه کردن (Insert)
Person p1 = new Person()
{
FirstName = "hasan",
LastName = "naseri",
Age = 20
};
dB.People.Add(p1);
در این بخش، یک شیء جدید از کلاس Person ایجاد کرده و آن را به مجموعه People در پایگاه داده اضافه میکنید.
انتخاب (Select)
var res = dB.People.SingleOrDefault(p => p.PersonID == 4);
این کد یک شخص را با PersonID برابر با ۴ از پایگاه داده انتخاب میکند. اگر چنین شخصی وجود داشته باشد، آن را در متغیر res ذخیره میکند.
بروز رسانی (Update)
if (res != null)
{
res.Age = 45;
}
اگر شخصی با PersonID برابر با ۴ پیدا شود، سن او را به ۴۵ تغییر میدهید.
حذف (Delete)
dB.People.Remove(res);
این کد شخص انتخاب شده را از پایگاه داده حذف میکند.
ذخیره (Save)
dB.SaveChanges();
در نهایت، تمام تغییرات انجام شده را در پایگاه داده ذخیره میکنید.
MyContacts.zip
حجم:
11M
من دفترچه تلفن را به Entity تغییر دادم
پروژه ASP.Net Core MVC (وب و سی شارپ)
من دفترچه تلفن را به Entity تغییر دادم
فرم اصلی
1. رویداد بارگذاری فرم
private void Form1_Load(object sender, EventArgs e)
{
bindGrid();
DataGridViewButtonColumn editButton = new DataGridViewButtonColumn();
editButton.HeaderText = "ویرایش";
editButton.Text = "ویرایش";
editButton.Name = "editButton";
editButton.FillWeight = 55;
editButton.UseColumnTextForButtonValue = true;
dgContacts.Columns.Add(editButton);
DataGridViewButtonColumn deleteButton = new DataGridViewButtonColumn();
deleteButton.HeaderText = "حذف";
deleteButton.Text = "حذف";
deleteButton.Name = "deleteButton";
deleteButton.FillWeight = 50;
deleteButton.UseColumnTextForButtonValue = true;
dgContacts.Columns.Add(deleteButton);
}
این متد هنگام بارگذاری فرم اجرا میشود. ابتدا دادهها را به گرید بایند میکند و سپس دو ستون دکمه برای ویرایش و حذف به گرید اضافه میکند.
2. بایند کردن دادهها به گرید
private void bindGrid()
{
using (Contact_DBEntities db = new Contact_DBEntities())
{
dgContacts.AutoGenerateColumns = false;
dgContacts.Columns[0].Visible = false;
dgContacts.DataSource = db.MyContacts.ToList();
}
}
این متد دادهها را از دیتابیس میخواند و به گرید بایند میکند. ستون اول گرید را نیز مخفی میکند.
3. رویداد کلیک دکمه تازهسازی
private void btnRefresh_Click(object sender, EventArgs e)
{
bindGrid();
}
این متد هنگام کلیک بر روی دکمه تازهسازی، دادهها را مجدداً بایند میکند.
4. رویداد کلیک دکمه افزودن مخاطب جدید
private void btnNewCantact_Click(object sender, EventArgs e)
{
frmAddOrEdit frm = new frmAddOrEdit();
frm.ShowDialog();
if (frm.DialogResult == DialogResult.OK)
{
bindGrid();
}
}
این متد فرم افزودن یا ویرایش مخاطب را باز میکند و پس از افزودن یا ویرایش مخاطب، دادهها را مجدداً بایند میکند.
5. رویداد تغییر متن جستجو
private void txtSearch_TextChanged(object sender, EventArgs e)
{
using(Contact_DBEntities db = new Contact_DBEntities())
{
dgContacts.DataSource = db.MyContacts.Where(c => c.Name.Contains(txtSearch.Text) || c.Family.Contains(txtSearch.Text)).ToList();
}
}
این متد هنگام تغییر متن جستجو، دادههای گرید را بر اساس متن جستجو فیلتر میکند.
6. رویداد کلیک سلولهای گرید
private void dgContacts_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == dgContacts.Columns["editButton"].Index && e.RowIndex >= 0)
{
if (dgContacts.CurrentRow != null)
{
int contactId = int.Parse(dgContacts.CurrentRow.Cells[0].Value.ToString());
frmAddOrEdit frm = new frmAddOrEdit();
frm.contactId = contactId;
if (frm.ShowDialog() == DialogResult.OK)
{
bindGrid();
}
}
}
if (e.ColumnIndex == dgContacts.Columns["deleteButton"].Index && e.RowIndex >= 0)
{
string name = dgContacts.CurrentRow.Cells[1].Value.ToString();
string family = dgContacts.CurrentRow.Cells[2].Value.ToString();
string fullName = name + " " + family;
if (MessageBox.Show($"آیا از حذف {fullName} مطمئن هستید؟ ", "توجه", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
int contactID = int.Parse(dgContacts.CurrentRow.Cells[0].Value.ToString());
using(Contact_DBEntities db = new Contact_DBEntities())
{
MyContact contact = db.MyContacts.Single(c => c.ContactID == contactID);
db.MyContacts.Remove(contact);
db.SaveChanges();
}
bindGrid();
}
}
}
این متد برای مدیریت کلیک بر روی دکمههای ویرایش و حذف در گرید استفاده میشود. اگر دکمه ویرایش کلیک شود، فرم ویرایش باز میشود و اگر دکمه حذف کلیک شود، مخاطب حذف میشود.
پروژه ASP.Net Core MVC (وب و سی شارپ)
من دفترچه تلفن را به Entity تغییر دادم
فرم ثبت و ویرایش
1. تعریف کلاس و متغیرها
public partial class frmAddOrEdit : Form
{
Contact_DBEntities db = new Contact_DBEntities();
public int contactId = 0;
public frmAddOrEdit()
{
InitializeComponent();
}
}
این بخش کلاس فرم را تعریف میکند و یک نمونه از دیتابیس و یک متغیر برای شناسه مخاطب ایجاد میکند. سازنده فرم نیز کنترلهای فرم را مقداردهی اولیه میکند.
2. رویداد بارگذاری فرم
private void frmAddOrEdit_Load(object sender, EventArgs e)
{
if (contactId == 0)
{
this.Text = "افزودن شخص جدید";
}
else
{
this.Text = "ویرایش شخص";
MyContact contact = db.MyContacts.Find(contactId);
txtName.Text = contact.Name;
txtFamily.Text = contact.Family;
txtAge.Text = contact.Age.ToString();
txtMobaile.Text = contact.Mobile;
txtEmail.Text = contact.Email;
txtAddress.Text = contact.Address;
btnSubmit.Text = "ویرایش";
}
}
این متد هنگام بارگذاری فرم اجرا میشود. اگر contactId برابر صفر باشد، فرم برای افزودن مخاطب جدید تنظیم میشود. در غیر این صورت، اطلاعات مخاطب موجود را برای ویرایش بارگذاری میکند.
3. متد اعتبارسنجی ورودیها
bool ValidateInputs()
{
if (txtName.Text == "")
{
MessageBox.Show("لطفا نام را وارد کنید", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (txtFamily.Text == "")
{
MessageBox.Show("لطفا نام خانوادگی را وارد کنید", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (txtAge.Value == 0)
{
MessageBox.Show("لطفا سن را وارد کنید", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (txtMobaile.Text == "")
{
MessageBox.Show("لطفا موبایل را وارد کنید", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (txtEmail.Text == "")
{
MessageBox.Show("لطفا ایمیل را وارد کنید", "هشدار", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
return true;
}
این متد ورودیهای کاربر را اعتبارسنجی میکند و در صورت وجود خطا، پیامهای مناسب را نمایش میدهد.
4. رویداد کلیک دکمه ثبت
private void btnSubmit_Click(object sender, EventArgs e)
{
if (ValidateInputs())
{
if (contactId == 0)
{
MyContact contact = new MyContact();
contact.Name = txtName.Text;
contact.Family = txtFamily.Text;
contact.Age = (int)txtAge.Value;
contact.Mobile = txtMobaile.Text;
contact.Email = txtEmail.Text;
contact.Address = txtAddress.Text;
db.MyContacts.Add(contact);
}
else
{
var contact = db.MyContacts.Find(contactId);
contact.Name = txtName.Text;
contact.Family = txtFamily.Text;
contact.Age = (int)txtAge.Value;
contact.Mobile = txtMobaile.Text;
contact.Email = txtEmail.Text;
contact.Address = txtAddress.Text;
}
db.SaveChanges();
MessageBox.Show("عملیات با موفقیت ثبت شد", "موفقیت", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
}
}
این متد هنگام کلیک بر روی دکمه ثبت اجرا میشود. ابتدا ورودیها را اعتبارسنجی میکند و سپس بر اساس مقدار contactId، مخاطب جدیدی ایجاد میکند یا مخاطب موجود را ویرایش میکند. در نهایت، تغییرات را ذخیره کرده و پیام موفقیت نمایش میدهد.
الگوهای طراحی یا Design Patterns، راهحلهای قابل تکرار و اثباتشدهای برای مشکلات رایج در طراحی نرمافزار هستند. این الگوها به شما کمک میکنند تا کدهای تمیزتر، قابل نگهداریتر و قابل فهمتری بنویسید. الگوهای طراحی به سه دسته کلی تقسیم میشوند:
1- الگوهای طراحی ایجادی (Creational Patterns): این الگوها به ایجاد اشیاء به شیوهای که مناسبترین و بهینهترین روش باشد، کمک میکنند. مثالهایی از این الگوها شامل Singleton، Factory Method و Abstract Factory هستند.
2- الگوهای طراحی ساختاری (Structural Patterns): این الگوها به ترکیب کلاسها و اشیاء برای تشکیل ساختارهای بزرگتر و پیچیدهتر کمک میکنند. مثالهایی از این الگوها شامل Adapter، Composite و Decorator هستند.
3- الگوهای طراحی رفتاری (Behavioral Patterns): این الگوها به تعاملات و مسئولیتهای بین اشیاء کمک میکنند. مثالهایی از این الگوها شامل Observer، Strategy و Command هستند.
استفاده از الگوهای طراحی میتواند به شما در حل مشکلات متداول در برنامهنویسی شیءگرا کمک کند و باعث افزایش کیفیت و قابلیت نگهداری نرمافزار شود.
ادامه مطالب در این سایت
https://developersho.com/blog/what-is-design-pattern
تست واحد یا Unit Testing یک مرحله از تست نرمافزار است که در آن بخشهای کوچک و مجزا از یک برنامه (که به آنها Unit یا واحد گفته میشود) به صورت جداگانه تست میشوند. هدف از Unit Testing این است که اطمینان حاصل شود که هر بخش کوچک از برنامه به درستی و مطابق با انتظارات عمل میکند.
مزایای Unit Testing- کاهش باگها: با تست کردن هر واحد به صورت جداگانه، میتوان باگها را در مراحل اولیه توسعه شناسایی و رفع کرد.
- کد تمیزتر: نوشتن تستهای واحد به شما کمک میکند تا کدهای خود را بهینهتر و قابل نگهداریتر کنید.
- مستندسازی کد: تستهای واحد به عنوان مستندات زنده برای کدهای شما عمل میکنند و نشان میدهند که هر بخش از کد چه کاری انجام میدهد.
- تسهیل تغییرات: با داشتن تستهای واحد، میتوانید با اطمینان بیشتری تغییرات در کدهای خود ایجاد کنید، زیرا میدانید که تستها به شما کمک میکنند تا مشکلات احتمالی را شناسایی کنید.
نحوه انجام Unit Testingتستهای واحد میتوانند به صورت دستی یا خودکار انجام شوند، اما بیشتر مواقع از روش خودکار استفاده میشود. در روش خودکار، برنامهنویس کدهای تست را مینویسد و آنها را به پروژه اضافه میکند. این کدهای تست به صورت خودکار اجرا میشوند و نتایج آنها نشان میدهد که آیا کدهای اصلی به درستی کار میکنند یا خیر.
ابزارهای محبوب برای Unit Testing
- xUnit:
یک فریمورک محبوب برای تست واحد در زبانهای مختلف برنامهنویسی.
- NUnit:
یک فریمورک تست واحد برای زبان سیشارپ.
- JUnit:
یک فریمورک تست واحد برای زبان جاوا.
ویژگیهای پیشرفته سیشارپ به شما کمک میکنند تا کدهای بهینهتر، کارآمدتر و قابل نگهداریتری بنویسید. در اینجا چند نمونه از این ویژگیها را معرفی میکنم:
- Async/Await:
این ویژگیها به شما اجازه میدهند تا برنامههای غیرهمزمان بنویسید که میتوانند به طور همزمان چندین کار را انجام دهند بدون اینکه رابط کاربری قفل شود.
- LINQ (Language Integrated Query): LINQ
به شما اجازه میدهد تا دادهها را از منابع مختلف مانند پایگاه دادهها، مجموعهها و XML به صورت یکپارچه و با استفاده از سینتکس مشابه SQL جستجو و دستکاری کنید.
- Delegates and Events: Delegates
به شما اجازه میدهند تا متدها را به عنوان پارامتر به متدهای دیگر ارسال کنید. Events نیز برای مدیریت رویدادها و تعاملات بین اشیاء استفاده میشوند.
- Generics: Generics
به شما اجازه میدهند تا کلاسها و متدهایی بنویسید که با انواع مختلف دادهها کار کنند بدون اینکه نیاز به تکرار کد باشد.
- Reflection: Reflection
به شما اجازه میدهد تا در زمان اجرا اطلاعاتی درباره انواع و اعضای آنها به دست آورید و حتی آنها را تغییر دهید.
- Span and Memory:
این ویژگیها به شما کمک میکنند تا با دادههای حافظه به صورت کارآمدتری کار کنید و از تخصیصهای غیرضروری حافظه جلوگیری کنید.
این ویژگیها به شما کمک میکنند تا برنامههای پیچیدهتر و بهینهتری بنویسید.