اشتراکها
ASP.NET Core به زبان ساده
ممنون این مطلب رو خودم عملی کردم . برای جدول اطلاعات ثابت مثل استانها وشهرها و.... . فقط یک سوال اونم اینکه امکانش هست از طریق فایل اکسل یا فایل دیگه این عملیات انجام بشه؟ یعنی اطلاعات رو تو یه فایل داشته باشیم و Migration از طریق این فایل دادههای مارو مقدار دهی کنه.
نظرات مطالب
سفارشی کردن ASP.NET Identity در MVC 5
سلام، ممنون بخاطر پست مفیدتون. من تمام مباحثی که شما گفتید جداولمو custom کردم و با migration تغییراتمو اعمال میکنم ولی وقتی میخوام دیتابیسمو آپدیت کنم خطای زیر رو میده. اصلا من با فیلد UserName کاری نداشتم و ندارم. بنده از وب فرم استفاده میکنم.
نظرات مطالب
EF Code First #4
بر اساس دیتابیس موجود که دارای اطلاعات است مدل را میسازم میخواستم migration را فعال کنم. بر اساس دستورات پاور شل قبلا آموزش داده اید میخواستم ببینم چگونه میتوان این کار را بصورت code base انجام داد. ظاهرا دستورات پاورش معادل code base هم دارند.
با تشکر
با تشکر
نظرات مطالب
EF Code First #2
ممنون از پاسخ دهی شما، ولی فکر کنم منظورم رو بد رسوندم، من دقیقا می خوام برام Alter Table بزنه، نه این که کاری به دیتابیس نداشته باشه، ( مثل NHibernate )
آیا با Migration ها چنین چیزی به سادگی ( در حد چند خط کد قابل استفاده برای کل برنامه )، امکانپذیر هست یا خیر ؟
متاسفانه من همچین چیزی ندیدم تو امکاناتش
آیا با Migration ها چنین چیزی به سادگی ( در حد چند خط کد قابل استفاده برای کل برنامه )، امکانپذیر هست یا خیر ؟
متاسفانه من همچین چیزی ندیدم تو امکاناتش
پاسخ به بازخوردهای پروژهها
خطا در اجرای پروژه
دوست عزیز:
این موارد مشکلات پروژه نیستند. دلیل بازخوردهای پی دی پی تکراری شما را متوجه نمیشوم.
لازم است وقت بذارید و مباحث migration رو مطالعه کنید. وقتی دیتابیسی ساخته نشده باشد، امکان لاگین کردن برای آن هست؟! بازخورد پروژه باخورد پروژه است و لزومی ندارد پیغام خصوصی ارسال کنید.
نگارش نهایی دات نت 6، حدود یک ماه دیگر منتشر میشود و اگر برای نمونه RC2 آنرا نصب کرده باشید، با ایجاد یک پروژهی کنسول جدید مبتنی بر آن ... شگفت زده خواهید شد! شاید انتظار داشته باشید که با چنین فایلی مواجه شوید:
اما یک چنین خروجی تولید میشود:
این مورد قابلیتی است که به همراه C# 9.0 به نام «Top Level Programs» ارائه شد و اکنون در تمام قالبهای پیشفرض پروژههای مبتنی بر دات نت 6، استفاده شدهاست. این قالب شاید برای تازهکارها، جالب باشد و کم حجم و کم سطر، اما «ما آنرا درخواست نداده بودیم!».
روش بازگشت به قالبهای قبلی
در حال حاضر و در نگارش فعلی و حتی رسمی دات نت 6، روشی برای بازگشت به حالت قبلی وجود ندارد که به احتمال زیاد در نگارشهای پس از RTM لحاظ خواهد شد (میتوانید در اینجا ^ و ^ به آن رای دهید). تنها راه حل موجود، استفاده از دستور زیر است:
این دستور در اصل به این معنا است که پروژهی من را بر اساس قالب پروژههای NET 5.0. تولید کن؛ اما در فایل csproj آن، بجای net5.0 از net6.0 به عنوان target framework استفاده شود:
در اینجا سطر net5.0 را حذف و با net6.0 جایگزین کنید.
using System; namespace MyVerboseApp { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
// See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!");
روش بازگشت به قالبهای قبلی
در حال حاضر و در نگارش فعلی و حتی رسمی دات نت 6، روشی برای بازگشت به حالت قبلی وجود ندارد که به احتمال زیاد در نگارشهای پس از RTM لحاظ خواهد شد (میتوانید در اینجا ^ و ^ به آن رای دهید). تنها راه حل موجود، استفاده از دستور زیر است:
dotnet new console --framework net5.0 --target-framework-override net6.0
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> - <TargetFramework>net5.0</TargetFramework> + <TargetFramework>net6.0</TargetFramework> </PropertyGroup> </Project>
تا اینجا هر آنچه درباره git آموختیم در رابطه با عملکرد git به صورت محلی بود. اما یکی از ویژگیهای سیستمهای توزیع شده، امکان استفاده از آنها به صورت remote میباشد.
در مورد git تفاوت چندانی بین سرورها و کلاینتها وجود ندارد. تنها تفاوت، نحوهی پیکربندی سرور است که این امکان را میدهد تا چندین کلاینت به صورت همزمان به آن متصل شده و با repository آن کار کنند. اما عملا تفاوتی بین repository موجود در کلاینت و سرور نیست.
تذکر ۱: در این مقاله از وب سایت github برای توضیح مثالها استفاده شده است. github قدیمیترین و قدرتمندترین وب سایت برای مدیریت repositoryهای git است. اما اجباری در انتخاب آن نیست؛ زیرا انتخابهای فراوانی از جمله bitbucket نیز وجود دارد.
تذکر ۲: نام مستعار origin اجباری نیست؛ اما از آن جهت که نام پیش فرض است، در اکثر مثالها و توضیحات استفاده شده است.
قبل از شروع مبحث بهتر است کمی دربارهی پروتکلهای ارتباطی پشتیبانی شده توسط git صحبت کنیم:
git از ۴ نوع پروتکل پشتیبانی میکند:
۱) (http(s: پروتکل http با پورت ۸۰ و https با پورت ۴۴۳ کار میکند و معمولا فایروالها مشکلی با این پروتکلها ندارند. از هر دوی آنها میتوان برای عملیات نوشتن و یا خواندن استفاده نمود و میتوان آنها را به گونهای تنظیم کرد که برای برقراری ارتباط نیاز به تائید هویت داشته باشند.
۲) git: پروتکلی فقط خواندنی است که به صورت anonymous و بر روی پورت ۹۴۱۸ کار میکند. شکل استفاده از آن به صورت زیر است و معمولا در github کاربرد فراوانی دارد:
git://github.com/[username]/[repositoryname].git
۳) ssh: همان پروتکل استفاده شده در یونیکس است که بر اساس مقادیر کلیدهای عمومی و خصوصی تعیین هویت را انجام میدهد. شکل استفاده از آن به صورت زیر است و بر روی پورت ۲۲ کار میکند و امکان نوشتن و خواندن را میدهد:
git@github.com:[username]/[repositoryname].git
۴) file: تنها استفاده محلی دارد و امکان نوشتن و خواندن را میدهد.
نحوهی عملکرد git به صورت remote:
به طور کلی هر برنامهنویس نیاز به دو نوع از دستورات دارد تا همواره repository محلی با remote هماهنگ باشد:
۱) بتواند به طریقی دادههای موجود در repository محلی خود را به سمت سرور بفرستد.
۲) این امکان را داشته باشد تا repository محلی خود را با استفاده از repository در سمت سرور آپدیت نماید تا از آخرین تغییراتی که توسط بقیه اعضای گروه صورت گرفته است آگاهی یابد.
طریقه رفتار git برای کار با repositoryهای remote به صورت زیر است:
هنگامیکه کاربر قصد دارد تا repository یا شاخهای از آن را به سمت سرور بفرستد، git ابتدا یک شاخه با نام همان شاخه به اضافه /origin ایجاد میکند. مثلا برای شاخه master، آن نام به صورت زیر میشود:
origin/master
عملکرد این شاخه دقیقا مانند دیگر شاخههای git است؛ با این تفاوت که امکان check-in یا out برای این نوع شاخهها وجود ندارد. زیرا git باید این شاخهها را با شاخهها متناظرشان در remote هماهنگ نگه دارد.
از این پس این شاخهی ایجاد شده، به عنوان واسطی بین شاخه محلی و شاخه راه دور عمل میکند.
cloning:
با استفاده از دستور clone میتوان یک repository در سمت سرور را به طور کامل در سمت کلاینت کپی کرد. به عنوان مثال repository مربوط به کتابخانه jquery از وب سایت github به صورت زیر است:
git clone https://github.com/jquery/jquery.git
همچنین میتوان با استفاده از دستور زیر پوشهای با نامی متفاوت را برای repository محلی انتخاب نمود:
git clone [URL][directory name]
اضافه کردن یک remote repository:
برای آنکه بتوان تغییرات یک remote repository را به repository محلی منتقل نمود، ابتدا باید آن را به لیست repositoryهای ریموت که در فایل config. ذخیره میشود به شکل زیر اضافه نمود:
git remote add [alias][URL]
در دستور فوق، برای repository باید یک نام مستعار تعریف کرد و در بخش URL باید آدرسی که سرور به وسیله آن امکان دریافت اطلاعات را به ما میدهد، نوشت. البته این بستگی به نوع پروتکل انتخابی دارد. به عنوان مثال:
git remote add origin https://github.com/jquery/jquery.git
git remote
در صورتیکه دستور فوق را با v- تایپ کنید اطلاعات کاملتری در رابطه با repositoryها مشاهده خواهید کرد.
همچنین برای حذف یک remote repository از دستور زیر استفاده میکنیم:
git remote [alias] -rm
در صورتیکه بخواهید لیستی از شاخههای remote را مشاهده کنید کافیست از دستور زیر استفاده کنید:
git branch -r
همچنین میتوان از دستور زیر برای نمایش تمامی شاخهها استفاده کرد:
git branch -a
fetch:
برای دریافت اطلاعات از دستور زیر استفاده میکنیم:
git fetch [alias][alias/branch name]
در صورتیکه تنها یک repository باشد میتوان از نوشتن نام مستعار صرفنظر نمود. همچنین اگر شاخه یا شاخههای مورد نظر به صورت track شده باشند، میتوان قسمت دوم دستور فوق را نیز ننوشت.
اگر بعد از اجرای دستور فوق، بر روی یک شاخه log بگیرید، خواهید دید که تغییرات در شاخه محلی اعمال نشده است زیرا دستور فوق تنها دادهها را بر روی شاخه [origin/[branchname ذخیره کرده است. برای آپدیت شدن شاخه اصلی باید با استفاده از دستور merge آن را در شاخه مورد نظر ادغام کرد.
pulling:
چون کاربرد دو دستور fetch و merge به صورت پشت سر هم زیاد است git دو دستور فوق را با استفاده از pull انجام میدهد:
pull [alias][remote branch name ]
اگر دو مقدار فوق را برای دستور pull تعیین نکنید، ممکن است در هنگام اجرای دستور فوق با خطایی مواجه شوید مبنی بر اینکه git نمیداند دقیقا شاخه ریموت را با کدام شاخه محلی باید ادغام کند. این مشکل زمانی پیش میآید که برای شاخه ریموت یک شاخه محلی متناظر وجود نداشته باشد. برای ایجاد تناظر بین دو شاخه ریموت و لوکال درگذشته باید فایل config. را تغییر میدادیم، اما نسخه جدید git دستوری را برای آن دارد:
git branch --set-upstream [local brnach][alias/branch name]
با اجرای این دستور از این پس شاخه محلی تغییرات شاخه remote را دنبال میکند.
pushing:
با استفاده از push میتوان تغییرات ایجاد شده را به remote repository انتقال داد:
git push -u [alias][branch name ]
وجود u- در اینجا بدین معنا است که ما میخواهیم تغییرات repository در سمت سرور دنبال شود. در صورت استفاده نکردن از u- بایستی برای push هر بار مقادیر داخل کروشهها را بنویسیم. در صورتیکه بعدا بخواهیم، میتوان توسط همان دستوری که در قسمت pull گفته شد دو شاخه را به هم وابسته کنیم.
tag:
همانطور که قبلا گفته شد تگها برای نشانهگذاری و دسترسی راحتتر به به commitها هستند. برای ایجاد یک تگ از دستور زیر استفاده میشود:
git tag [tag name]
همچنین میتوان با a- برای تگ پیامی نوشت و یا با s- آن را امضا کرد. برای مشاهده تگها از دستور زیر استفاده میشود:
git tag
در حالت پیشفرض git تگها را push نمیکند. برای push کردن تگها باید دستور push را با اصلاحکننده tages-- به کارببرید.
- با توجه به مزیتهایی که قبلاً در پیادهسازی سرویس محور برای IUnitOfWork در نظر گرفته میشد و به طور مفصل هم درباره آن بحث شد، در این نوع پیادهسازی آیا باید نگرش جدیدی به استفاده مستقیم از DbContext اصلی برنامه داشت؟
- برای استفاده از مطلب کار با چندین نوع بانک اطلاعاتی متفاوت در Entity Framework Core در حالت فوق و با توجه به حذف IUnitOfWork، آیا پیادهسازی زیر صحیح است:
namespace MinimalBlog.Dal.SqlServer public class SqlServerDbContext : MinimalBlogDbContext { //Sql Server Settings }
namespace MinimalBlog.Dal.Sqlite public class SqliteDbContext : MinimalBlogDbContext { //Sqlite Settings }
var connectionStringKey = Configuration.GetConnectionString("InUseKey"); var connectionString = Configuration.GetConnectionString(connectionStringKey); switch (connectionStringKey) { case "SqlServerConnection": services.AddScoped<MinimalBlogDbContext, SqlServerDbContext>(); services.AddDbContext<SqlServerDbContext>(options => opt.UseSqlServer(connectionString)); break; case "SqliteConnection": services.AddScoped<MinimalBlogDbContext, SqliteDbContext>(); services.AddDbContext<SqliteDbContext>(options => options.UseSqlite(connectionString)); break; default: throw new NotImplementedException($"`{connectionStringKey}` is not defined in `appsettings.json` file."); }