ادامه آشنایی با NUnit
حالتهای مختلف Assert :
NUnit framework حالتهای مختلفی از دستور Assert را پشتیبانی میکند که در ادامه با آنها آشنا خواهیم شد.
کلاس Assertion :
این کلاس دارای متدهای زیر است:
public static void Assert(bool condition)
public static void Assert(string message, bool condition)
public static void AssertEquals(string message, object expected, object actual)
public static void AssertEquals(string message, float expected, float actual, float delta)
public static void AssertEquals(string message, double expected, double actual, double delta)
public static void AssertEquals(string message, int expected, int actual)
public static void AssertEquals(int expected, int actual)
public static void AssertEquals(object expected, object actual)
public static void AssertEquals(float expected, float actual, float delta)
public static void AssertEquals(double expected, double actual, double delta)
public static void AssertNotNull(string message, object anObject)
public static void AssertNotNull(object anObject)
public static void AssertNull(string message, object anObject)
public static void AssertNull(object anObject)
public static void AssertSame(string message, object expected, object actual)
public static void AssertSame(object expected, object actual)
public static void Fail(string message)
public static void Fail()
نکته:
در یک متد آزمایش واحد شما مجازید به هرتعدادی که لازم است از متدهای Assertion استفاده نمائید. در این حالت اگر تنها یکی از متدهای assertion با شکست روبرو شود، کل متد آزمایش واحد شما مردود گزارش شده و همچنین عبارات بعدی Assertion بررسی نخواهند شد. بنابراین توصیه میشود به ازای هر متد آزمایش واحد، تنها از یک Assertion استفاده نمائید.
مهم!
کلاس Assertion منسوخ شده است و توصیه میشود بجای آن از کلاس Assert استفاده گردد.
آشنایی با کلاس Assert :
این کلاس از متدهای زیر تشکیل شده است:
الف) بررسی حالتهای تساوی
Assert.AreEqual( object expected, object actual );
Assert.AreNotEqual( object expected, object actual );
برای مشاهده انواع و اقسام overload های آنها میتوانید به راهنمای NUnit که پس از نصب، در پوشه doc آن قرار میگیرد مراجعه نمائید.
همچنین دو متد زیر و انواع overload های آنها جهت برسی اختصاصی حالت تساوی دو شیء بکار میروند:
Assert.AreSame( object expected, object actual );
Assert.AreNotSame( object expected, object actual );
Assert.Contains( object anObject, IList collection );
Assert.IsTrue( bool condition );
Assert.IsFalse( bool condition);
Assert.IsNull( object anObject );
Assert.IsNotNull( object anObject );
Assert.IsNaN( double aDouble );
Assert.IsEmpty( string aString );
Assert.IsEmpty( ICollection collection );
Assert.IsNotEmpty( string aString );
Assert.IsNotEmpty( ICollection collection );
ج) بررسی حالتهای مقایسهای
Assert.Greater( double arg1, double arg2 );
Assert.GreaterOrEqual( int arg1, int arg2 );
Assert.Less( int arg1, int arg2 );
Assert.LessOrEqual( int arg1, int arg2 );
از ذکر انواع و اقسام overload های این توابع جهت طولانی نشدن مطلب پرهیز شد.
د) بررسی نوع اشیاء
Assert.IsInstanceOfType( Type expected, object actual );
Assert.IsNotInstanceOfType( Type expected, object actual );
Assert.IsAssignableFrom( Type expected, object actual );
Assert.IsNotAssignableFrom( Type expected, object actual );
ه) متدهای کمکی
Assert.Fail();
Assert.Ignore();
طراحی متدی که بررسی کند آیا یک رشته مورد نظر حاوی عبارتی خاص میباشد یا خیر:
public void AssertStringContains( string expected, string actual,
string message )
{
if ( actual.IndexOf( expected ) < 0 )
Assert.Fail( message );
}
StringAssert.Contains( string expected, string actual );
StringAssert.StartsWith( string expected, string actual );
StringAssert.EndsWith( string expected, string actual );
StringAssert.AreEqualIgnoringCase( string expected, string actual );
StringAssert.IsMatch( string expected, string actual );
ز) بررسی فایلها
FileAssert.AreEqual( Stream expected, Stream actual );
FileAssert.AreEqual( FileInfo expected, FileInfo actual );
FileAssert.AreEqual( string expected, string actual );
FileAssert.AreNotEqual( Stream expected, Stream actual );
FileAssert.AreNotEqual( FileInfo expected, FileInfo actual );
FileAssert.AreNotEqual( string expected, string actual );
ح) بررسی collections
CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection, Type expectedType );
CollectionAssert.AllItemsAreNotNull( IEnumerable collection );
CollectionAssert.AllItemsAreUnique( IEnumerable collection );
CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual );
CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual);
CollectionAssert.AreNotEqual( IEnumerable expected, IEnumerable actual );
CollectionAssert.AreNotEquivalent( IEnumerable expected,IEnumerable actual );
CollectionAssert.Contains( IEnumerable expected, object actual );
CollectionAssert.DoesNotContain( IEnumerable expected, object actual );
CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset );
CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset);
CollectionAssert.IsEmpty( IEnumerable collection );
CollectionAssert.IsNotEmpty( IEnumerable collection );
نکته: در تمامی overload های این توابع، آرگومان message نیز وجود دارد. از این آرگومان زمانیکه آزمایش با شکست مواجه شد، جهت ارائه اطلاعات بیشتری استفاده میگردد.
ادامه دارد...
استاد گرامی پرسشی داشتم
ما در سازمانمان نرم افزاری داریم که کاربران آن در Active directory تعریف شده اند.
برنامه با وب سرویس در ارتباط است که در یک سروری قرار گرفته است که آن سرور با یک سرور دیگر از طریق کابل شبکه در ارتباط است.
سرور دوم سروری است که پایگاه داده روی آن قرار گرفته است.
با توجه به اینکه با WCF کاربر جاری برنامه را می توان به دست آورد؛ ما کاربر جاری را تا سطح سرور 1 می آوریم ولی برای ارسال آن به اس کیو ال دو راه حل داریم.
راهی که هم اکنون از آن استفاده می کنیم این است که Connection string مان تک کاربره است و دیگر اینکه هم اکنون که کاربر جاری را داریم همان را با Connection string به سمت SQL بفرستیم و که در نتیجه گزارش گیری و مانیتورینگ بسیار خوبی خواهیم داشت. ولی باید همه کاربران در SQL تعریف شوند چون سرور پایگاه داده به دومین متصل نیست.
به نظر شما در صورتی که سرورهای نسبتاً خوبی از لحاظ سخت افزاری داشته باشیم و کاربرانی در حدود 2000 نفر به طور کلی و 200 نفر همزمان داشته باشیم، Connection string تک کاربره بهتر است یا چند کاربره؟
با سپاس فراوان
شما برای این کار یکسری تنظیمات را باید در Enterprise manager انجام بدهید
1-نصب Certificate در ویندوز خودتان(از طریق MMC)
2-فعال کردن Certificate در قسمت Enterprise Manager
3-پارامتر Encrypt را هم در قسمت Connection String خود لحاظ کنید.
--------------------
اگر سئوالی بود بنده در خدمتم.
یک فایل web.config معمولی را در نظر بگیرید (اطلاعات غیر ضروری حذف شده اند).
<?xml version="1.0" encoding="utf-8"?> <!-- A bunch of ASP.NET MVC web config stuff goes here . . . --> <configuration> <connectionStrings> <add name="DefaultConnection" value="YourConnectionStringAndPassword"/> </connectionStrings> <appSettings file="PrivateSettings.config"> <add key="owin:AppStartup" value="AspNetIdentity2ExtendingApplicationUser.Startup,AspNetIdentity2ExtendingApplicationUser" /> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="EMAIL_PASSWORD" value="YourEmailPassword"/> </appSettings> </configuration>
همچنین کلمه عبور یک ایمیل هم وجود دارد که نمیخواهیم به مخازن سورس کنترل ارسال شود، و مجددا ممکن است مقدارش بین توسعه دهندگان متفاوت باشد.
از طرفی بسیاری از تنظیمات این فایل متعلق به کل اپلیکیشن است، بنابراین صرفنظر کردن از کل فایل web.config در سورس کنترل گزینه جالبی نیست.
خوشبختانه کلاس ConfigurationManager راه حل هایی پیش پای ما میگذارد.
استفاده از خاصیت configSource برای انتقال قسمت هایی از تنظیمات به فایلی مجزا
با استفاده از خاصیت configSource میتوانیم قسمتی از تنظیمات (configuration section) را به فایلی مجزا منتقل کنیم. بعنوان مثال، رشتههای اتصال از مواردی هستند که میتوانند بدین صورت تفکیک شوند.
بدین منظور میتوانیم فایل تنظیمات جدیدی (مثلا با نام connectionStrings.config) ایجاد کنیم و سپس با استفاده از خاصیت نام برده در فایل web.config به آن ارجاع دهیم. برای این کار فایل تنظیمات جدیدی ایجاد کنید و مقادیر زیر را به آن اضافه کنید (xml header یا هیچ چیز دیگری نباید در این فایل وجود داشته باشد، تنها مقادیر تنظیمات).
<connectionStrings> <add name="DefaultConnection" value="YourConnectionStringAndPassword"/> </connectionStrings>
<connectionStrings configSource="ConnectionStrings.config"> </connectionStrings>
var conn = ConfigurationManager.ConnectionStrings["DefaultConnection"]; string connString = conn.ConnectionString; // etc.
استفاده از خاصیت file برای انتقال بخشی از تنظیمات به فایلی مجزا
ممکن است فایل تنظیمات شما (مثلا web.config) شامل مقادیری در قسمت <appSettings> باشد که برای کل پروژه تعریف شده اند (global) اما برخی از آنها محرمانه هستند و باید از سورس کنترل دور نگاه داشته شوند. در این سناریوها خاصیتی بنام file وجود دارد که مختص قسمت appSettings است و به ما اجازه میدهد مقادیر مورد نظر را به فایلی مجزا انتقال دهیم. هنگام دسترسی به مقادیر این قسمت تمام تنظیمات بصورت یکجا خوانده میشوند.
در مثال جاری یک کلمه عبور ایمیل داریم که میخواهیم محرمانه بماند. بدین منظور میتوانیم فایل پیکربندی جدیدی مثلا با نام PrivateSettings.config ایجاد کنیم. این فایل هم نباید xml header یا اطلاعات دیگری داشته باشد، تنها مقادیر appSettings را در آن نگاشت کنید.
<appSettings> <add key="MAIL_PASSWORD" value="xspbqmurkjadteck"/> </appSettings>
<appSettings file="PrivateSettings.config"> <add key="owin:AppStartup" value="AspNetIdentity2ExtendingApplicationUser.Startup,AspNetIdentity2ExtendingApplicationUser" /> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>
var pwd = ConfigurationManager.AppSettings["MAIL_PASSWORD"];
فایلهای ویژه را به gitignore. اضافه کنید
حال میتوانیم فایل web.config را به سورس کنترل اضافه کنیم، فایلهای ConnectionStrings.config و PrivateSettings.config را به فایل gitignore. اضافه کنیم و پروژه را commit کنیم. در این صورت فایلهای تنظیمات خصوصی به مخازن سورس کنترل ارسال نخواهند شد.
مستند سازی را فراموش نکنید!
مسلما اگر چنین رویکردی را در پیش بگیرید باید دیگران را از آن مطلع کنید (مثلا با افزودن توضیحاتی به فایل README.txt). بهتر است در فایل web.config خود هرجا که لازم است توضیحات XML خود را درج کنید و به توسعه دهندگان توضیح دهید که چه فایل هایی را روی نسخههای محلی خود باید ایجاد کنند و هر کدام از این فایلها چه محتوایی باید داشته باشند.
Json.NET 8.0 منتشر شد
To reduce allocations and memory usage when serializing Json.NET 8.0 adds a new IArrayPool interface. Json.NET is already very lean when it comes to allocations, working with raw characters on array buffers instead of allocated strings, but those buffers can easily grow large, and a new buffer is created each time JSON is read or written. IArrayPool allows array buffers to be reused, similar to connection pooling with a database, or thread pooling in .NET.
شاید شما هم قصد داشته باشید تا از برخی درخواستها به وب سایت یا اپلیکیشن خود ممانعت عمل بیاورید. نظیر درخواستهای SQL Injection یا برخی Query Stringهای خاص یا برخی درخواستهای مزاحم.
یکی از مزاحمت هایی که گریبانگیر وب سایت هاست، Botهای متفاوتی است که برای کپی اطلاعات، درج کامنت به صورت خودکار و مواردی از این دست، به آنها مراجعه میکنند. شاید در نگاه اول بد نباشد که این Botها به سراغ وب سایت ما بیایند و باعث افزایش تعداد ویزیت سایتمان شوند؛ ولی ضررهای ناشی از کپی و سرقت مطالب سایت، آنهم با سرعت بالا، بیشتر از منافع ناشی از بالا رفتن رنک سایت است. به طور مثال همین سایت NET Tips. دارای تعداد زیادی مقالات مفید است که افراد متعددی در نگارش و تهیه آنها زحمت کشیده اند، یا وب سایتی برای جلب اعتماد مشتریان جهت درج اطلاعاتشان و یا آگهی هایشان زحمت زیادی کشیده است، Botهای آمادهی زیادی وجود دارد که با چند دقیقه صرف وقت جهت تنظیم شدن آماده میشوند تا مطالب را طبق ساختار تعیین شده، مورد به مورد کپی کنند.
برای خلاصی از این موارد روشهای متعددی وجود دارد که از جمله آنها میتوان به تنظیمات فایل htaccess در وب سرورهایی نظیر Apache و یا web.config در IIS اشاره کرد. در این مقاله این امکان را با IIS مرور میکنیم و برای فعال سازی آن کافی است در:
-
IIS 7.5 و بالاتر، همراه با انتخاب Request Filtering در مراحل نصب IIS
-
IIS 7.0 پس از نصب بسته آپدیت Microsoft Knowledge Base Article 957508 .
-
IIS 6.0 با نصب URLScan 3.0
در بخش <system.webServer> و سپس <security>، تگ requestFiltering را استفاده کنیم، در این تگ دستورالعملهای ویژهی پالایشگر درخواستها را مینویسیم (filteringRules) هر دستورالعمل پالایش دارای خصیصههای (Attributes) زیر است:
denyUnescapedPercentمقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، درخواست هایی که دارای کاراکتر "درصد" (%) هستند و به وسیله escape character ها پوشش داده نشده باشند، رد میشوند. (جهت جلوگیری از حملات XSS و...)
مقدار پیش فرض true است.
name
عنوان دستورالعمل.
مقدار پیش فرض نداشته و درج کردن آن اجباری است.
scanAllRaw
مقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، پالایشگر درخواستها موظف است تا با بررسی متن header های درخواست، در صورت یافتن یکی از واژه هایی که در خصیصه denyStrings ذکر کرده اید، درخواست را رد کند.
مقدار پیش فرض false است.
scanQueryString
مقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، پالایشگر درخواستها موظف است تا Query string را بررسی کند تا در صورتی که یکی از واژههای درج شده در خصیصه denyStrings را بیابد، درخواست را رد کند.
اگر خصیصهی unescapeQueryString از تگ < requestFiltering > برابر با true باشد، query string دوبار بررسی میشود: یکبار متن query string برای یافتن عبارات ممنوعه و بار دیگر برای یافتن کاراکترهای بدون پوشش scaped .
مقدار پیشفرض false است.
scanUrl
مقدار Boolean و انتخابی
اگر برابر با true تنظیم گردد، پالایشگر درخواستها URL را برای یافتن واژههای ممنوعهی ذکر شده در خصیصه denyStrings بررسی مینماید.
مقدار پیش فرض false است.
چند مثال:
مثال 1: در این مثال عنوان User-Agent هایی را که در موارد متعدد برای وب سایت هایی که روی آنها کار میکردم مزاحمت ایجاد میکردند را پالایش میکنیم. (لیست این Botها آپدیت میشود)
<requestFiltering> <filteringRules> <filteringRule name="BlockSearchEngines" scanUrl="false" scanQueryString="false"> <scanHeaders> <clear /> <add requestHeader="User-Agent" /> </scanHeaders> <appliesTo> <clear /> </appliesTo> <denyStrings> <clear /> <add string="Python UrlLib" /> <add string="WGet" /> <add string="Apache HttpClient" /> <add string="Unknown Bot" /> <add string="Yandex Spider" /> <add string="libwww-perl" /> <add string="Nutch" /> <add string="DotBot" /> <add string="CCBot" /> <add string="Majestic 12 Bot" /> <add string="Java" /> <add string="Link Checker" /> <add string="Baiduspider" /> <add string="Exabot" /> <add string="PHP" /> </denyStrings> </filteringRule> </filteringRules> </requestFiltering>
مثال 2: ممانعت از SQL Injection
<requestFiltering> <filteringRules> <filteringRule name="SQLInjection" scanUrl="false" scanQueryString="true"> <appliesTo> <clear /> <add fileExtension=".asp" /> <add fileExtension=".aspx" /> <add fileExtension=".php" /> </appliesTo> <denyStrings> <clear /> <add string="--" /> <add string=";" /> <add string="/*" /> <add string="@" /> <add string="char" /> <add string="alter" /> <add string="begin" /> <add string="cast" /> <add string="create" /> <add string="cursor" /> <add string="declare" /> <add string="delete" /> <add string="drop" /> <add string="end" /> <add string="exec" /> <add string="fetch" /> <add string="insert" /> <add string="kill" /> <add string="open" /> <add string="select" /> <add string="sys" /> <add string="table" /> <add string="update" /> </denyStrings> <scanHeaders> <clear /> </scanHeaders> </filteringRule> </filteringRules> </requestFiltering>
مثال 3: ممانعت از درخواست انواع خاصی از فایل ها
<requestFiltering> <filteringRules> <filteringRule name="Block Image Leeching" scanUrl="false" scanQueryString="false" scanAllRaw="false"> <scanHeaders> <add requestHeader="User-agent" /> </scanHeaders> <appliesTo> <add fileExtension=".zip" /> <add fileExtension=".rar" /> <add fileExtension=".exe" /> </appliesTo> <denyStrings> <add string="leech-bot" /> </denyStrings> </filteringRule> </filteringRules> </requestFiltering>
اطلاعات بیشتر در وب سایت رسمی IIS
public partial class PersonallyEntities : DbContext { public PersonallyEntities() : base("name=PersonallyEntities") { } }
"name=PersonallyEntities"
metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=Personally;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
public static string BuildEntityConnection(string connectionString) { var entityConnection = new EntityConnectionStringBuilder { Provider = "System.Data.SqlClient", ProviderConnectionString = connectionString, Metadata = "res://*" }; return entityConnection.ToString(); }
public partial class PersonallyEntities : DbContext { public PersonallyEntities(string connectionString) : base(connectionString) { } }
: base(connectionString)
var entityConnectionString = BuildeEntityConnection("Data Source=localhost;Initial Catalog=Personally; Integrated Security=True"); var PersonallyDb = new PersonallyEntities(entityConnectionString);
در این مقاله چه چیزی را پوشش خواهیم داد:
· راه اندازی داکر
· پیکرهبندی container image
· وصل شدن به sql
· ساخت یک پروژه ساده net core.
· ایجاد دیتابیس
· ثبت رکورد در دیتابیس
قبل از هرچیز باید داکر را بر روی سیستم عامل خود (لینوکس) نصب نماید. چون نصب داکر بر روی لینوکس از حوصلهی این مقاله خارج میباشد، میتوانید با مراجعه به این لینک docker را نصب کنید. پس از نصب docker، برای اطمینان حاصل نمودن از نصب، با دستور docker version میتوان کانفیگ داکر را مشاهده کرد:
دانلود و نصب sql server بر روی داکر
قبل از هرچیز باید Image اسکیوال سرور را بر روی داکر دانلود نمائید. برای این کار وارد سایت dockerhub شوید و عبارت microsoft/mssql-server-linux را جستجو کنید.
همانطور که در تصویر نیز مشاهد میکنید، این بسته 10 میلیون بار دریافت شدهاست! در ادامه دستور زیر را در ترمینال خود Paste کنید و منتظر بمانید تا دانلود شود:
docker pull microsoft/mssql-server-linux:2017-latest
برای اجرای image sql از دستور زیر استفاده میکنیم:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \ -p 1433:1433 --name sql1 \ -d mcr.microsoft.com/mssql/server:2017-latest
Set the SA_PASSWORD : پسورد environment variable ای که شما انتخاب میکنید.
p 1433:1433- : شماره پورتی که Docker container بر روی آن اجرا میشود.
-d microsoft/mssql-server-linux:2017-latest : نام Image ای که میخواهیم اجرا کنیم.
همانطور که ملاحظه میکنید، در قسمت status، عبارت up به معنای در حال اجرا بودن container است. اگر عبارت دیگری را مشاهده کردید، با دستور dockr start id و وارد کردن شماره image خود میتوانید آن را اجرا کنید.
تا اینجا توانستیم sql server را اجرا کنیم. برای توضیحات بیشتر به این لینک مراجعه کنید.
وصل شدن به sql
برای وصل شدن به دیتابیس باید connection string دیتابیس مربوطه را داشته باشیم. با توجه به کانفیگهایی که در بالا انجام دادیم، connection string ما به شکل زیر خواهد بود:
Server Host: localhost Port: 1433 Authentication: SQL Server Authentication Login: SA Password: <StrongPasswordYouSet>
sudo docker exec -it sql1 "bash"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourNewStrong!Passw0rd>'
تا اینجای کار sql server آمادهی اجرا دستورات شما میباشد. در ادامه میخواهیم چند دستور سادهی sql را بر روی آن اجرا کنیم.
ساخت دیتابیس
با دستور sqlcmd زیر، ابتدا یک دیتابیس را میسازیم:
CREATE DATABASE TestDB
ساخت جدول
در ادامه، دستور زیر را برای ساخت جدول مینویسیم:
CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
ایجاد رکورد
مرحله بعدی، ایجاد یک رکورد جدید در دیتابیس میباشد:
INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
در آخر با استفاده از دستور go، کوئریهای بالا را اجرا میکنیم. اکنون باید یک دیتابیس جدید به نام TestDB و یک جدول جدید نیز به نام Inventory همچنین یک رکورد جدید در آن ثبت شده باشد. برای مشاهدهی تغییرات بالا، از دستورات زیر استفاده میکنیم:
- با دستور زیر لیست دیتابیسهای موجود را میتوان دید:
SELECT Name from sys.Databases
SELECT * FROM Inventory WHERE quantity > 152;
تا اینجا توانستیم docker را بر روی سیستم راه ندازی و همچنین sql server را بر روی آن نصب و اجرا کنیم. همچنین با دستورات sqlcmd توانستیم بر روی sql کوئری بزنیم.
ساخت و وصل شدن یک پروژهی net core. و وصل شدن به sql server
حال میخواهیم با یک پروژهی سادهی net core. به sql server فوق وصل شده و یک جدول را به دیتابیس مذکور اضافه کرده و یک کوئری اضافه کردن رکوردی را به آن جدول بنویسیم. برای شروع، یک پروژهی خالی net core. را ایجاد میکنیم. برای مثال یک پروژهی api را ایجاد میکنیم:
dotnet new webapi -o dockerapi
dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design
public class Students { public int Id { get; set; } public string Name { get; set; } public string Phone { get; set; } }
dotnet ef dbcontext scaffold "Server=localhost,1433\\Catalog=tutorial_database;Database=<YOUR_DATABASE_NAME>;User=SA;Password=<StrongPasswordYouSet>;" Microsoft.EntityFrameworkCore.SqlServer
"ConnectionStrings": { "TestingDatabase": "Server=localhost:1433\\Database=<YourDatabaseName>;User=SA;Password=<StrongPasswordYouSet>;" }
dotnet ef migrations add <NAME_OF_MIGRATION>
همانطور که مشاهده میکنید، migrations اضافه شده و موجودیت هم اضافه شدهاست. حال باید بر روی migrations خود آپدیت بزنیم:
ef database update
SELECT TABLE_NAME FROM dockerdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
نحوه کار با ftp - بخش اول
The remote server returned an error: (425) Can't open data connection