- در مورد فرمها، یک سری تغییر نام از نگارش RC3 به بعد رخ خواهند داد؛ مانند Control به FormControl و ControlGroup به FormGroup و امثال آن.
"dependencies": { "@angular/forms": "^0.1.0", },
- یک مثال تکمیلی: پیاده سازی debounce با FormControl جدید
آشنایی با Defensive programming - قسمت دوم
یک نمونه masked edit control با استفاده از یکی از پلاگینهای jQuery برای ASP.Net درست کردهام که میتونید شرح آنرا در آدرس زیر ملاحظه کنید
https://www.dntips.ir/2008/11/jquery-aspnet.html
ASP.NET MVC #18
- سپس دو کلاس Role و User را باید تعریف کنید. این دو رابطه many-to-many با هم دارند؛ یعنی هر کدام با یک ICollection به دیگری ارتباط پیدا میکنند. سپس این دو کلاس را در کلاس Context برنامه مطابق معمول توسط DbSetها در معرض دید EF قرار میدهید. مابقی آن کارکردن معمولی با این دو جدول اضافه شده به برنامه است:
public class EfRolesService : IRolesService { readonly IUnitOfWork _uow; readonly IDbSet<Role> _roles; public EfRolesService(IUnitOfWork uow) { _uow = uow; _roles = _uow.Set<Role>(); } public IList<Role> FindUserRoles(int userId) { var query = from role in _roles from user in role.Users where user.Id == userId select role; return query.OrderBy(x => x.Name).ToList(); } public string[] GetRolesForUser(int userId) { var roles = FindUserRoles(userId); if (roles == null || !roles.Any()) { return new string[] { }; } return roles.Select(x => x.Name).ToArray(); } public bool IsUserInRole(int userId, string roleName) { var query = from role in _roles where role.Name == roleName from user in role.Users where user.Id == userId select role; var userRole = query.FirstOrDefault(); return userRole != null; } }
public class CustomRoleProvider : RoleProvider { public override bool IsUserInRole(string username, string roleName) { // Since the role provider, in this case the CustomRoleProvider is instantiated by // the ASP.NET framework the best solution is to use the service locator pattern. // The service locator pattern is normally considered to be an anti-pattern but // sometimes you have to be pragmatic and accept the limitation on the framework // that is being used (in this case the ASP.NET framework). var rolesService = ObjectFactory.GetInstance<IRolesService>(); return rolesService.IsUserInRole(username.ToInt(), roleName); } public override string[] GetRolesForUser(string username) { var rolesService = ObjectFactory.GetInstance<IRolesService>(); return rolesService.GetRolesForUser(username.ToInt()); } // مابقی نیازی نیست پیاده سازی شوند
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton<BigCacheConsumer>(); builder.Services.AddSingleton<SmallCacheConsumer>(); builder.Services.AddKeyedSingleton<IMemoryCache, BigCache>("big"); builder.Services.AddKeyedSingleton<IMemoryCache, SmallCache>("small"); var app = builder.Build(); app.MapGet("/big", (BigCacheConsumer data) => data.GetData()); app.MapGet("/small", (SmallCacheConsumer data) => data.GetData()); app.Run(); class BigCacheConsumer([FromKeyedServices("big")] IMemoryCache cache) { public object? GetData() => cache.Get("data"); } class SmallCacheConsumer(IKeyedServiceProvider keyedServiceProvider) { public object? GetData() => keyedServiceProvider.GetRequiredKeyedService<IMemoryCache>("small"); }
- نسل بعدی زامارین است
- از دات نت 6 به بالا استفاده میکند
- روان، سریع و انعطاف پذیر است
- خطاهای بسیار کمتری دارد
- مخصوص موبایل طراحی شده است
- تجربه بیشتری نسبت به سایر پلتفرمها دارد
- مخصوص کراس پلتفرم طراحی شده
- از WinUI 3 استفاده میکند
- برای ویندوز 10 به بالا از تکنولوژی UWP و برای ویندوز 7 و لینوکس از Skia استفاده میکند
- از WinUI 3 استفاده میکند
- تمام ویژگیهای UWP را دارد
- محدودیتهای UWP را ندارد
- بصورت Full Trust اجرا میشود
- پیچیدگیهای UWP را ندارد
- از پلتفرم WPF برای اجرا استفاده میکند
- فقط بخشی از برنامه را مدرن میکند
- قسمتهای مدرن شده در نسخههای قبل ویندوز 10 اجرا نمیشود
در قسمت قبل کلیات نحوهی استفاده از Animation در Angular را مورد بررسی
قرار دادیم. در این بخش قصد داریم نحوهی اعمال Animation های پیشرفتهتری
را مورد بررسی قرار دهیم.
وضعیت void
این وضعیت به تمامی المانهایی که به view متصل نیستند، اعمال خواهد شد. این عدم اتصال به view برای یک المان میتواند بخاطر این باشد که این المان هنوز به صفحه وارد نشده است یا اینکه قبلا در صفحه بوده و الان در حال حذف شدن است.
درکل وضعیت void برای تعریف انیمیشنی در هنگام ورود و خروج المان به و از صفحه مورد استفاده قرار میگیرد. برای مثال گذار *=>void به تمامی المانهایی که view را ترک میکنند اعمال خواهد شد و void=>* به المانهایی که به view اضافه میشوند.
قطعه کد زیر سبب تعریف انیمیشنی بر روی المنتهای ورودی و خروجی از صفحه خواهد شد:
animations: [ trigger('flyInOut', [ transition('void => *', [ style({transform: 'translateX(-100%)'}), animate(100) ]), transition('* => void', [ animate(100, style({transform: 'translateX(100%)'})) ]) ]) ]
در این قطعه کد یک trigger به نام flyInOut تعریف شده است که در آن برای گذار ورود و خروج المنت در صفحه، انیمیشن تعریف شده است. همانطور که واضح است نیازی به تعریف حالت void، توسط تابع state وجود ندارد.
کد زیر نحوه استفاده از این trigger را نشان میدهد
(با فرض اینکه لیستی از کاربران را در متغییر users داریم که با
فراخوانی متد addNewUser یک آیتم به آن اضافه شده و با زدن دکمه Remove آیتم مورد نظر
از لیست حذف میشود):
<ul> <li *ngFor="let user of users" [@flyInOut]> {{user.FirstName}} <button (click)="remove(user)">Remove</button> </li> </ul> <button (click)="addNewUser()">Add New User</button>
همچنین به جای void=>* در تابع transition، از :enter و به جای *=>void، از :leave میتوان استفاده کرد.
transition(':enter', [ ... ]); // void => * transition(':leave', [ ... ]); // * => void
واضح است که شما میتوانید از حالت void به هر حالت
تعریف شدهی توسط خودتان نیز گذاری را تعریف کنید. برای مثال اگر قبلا حالت active و inactive را با استفاده
از تابع state
ساخته باشید، گذارهای زیر قابل تعریف خواهند بود و هیچگونه محدودیتی وجود نخواهد
داشت:
transition('void => inactive', //...) transition('inactive => void', //...) transition('void => active', //..) transition('active => void', //...)
کاربرد * در style
فرض کنید میخواهیم گذاری را تعریف کنیم که هنگام ورود
المنت، در ابتدا ارتفاع المنت را به مقداری 0px تنظیم
کرده و سپس همراه با یک انیمیشن، مقدار ارتفاع را به مقدار اصلی تنظیم خواهد کرد. چالشی
که در اینجا وجود دارد این است که مقدار ارتفاع المنت مشخص نیست و بستگی به اندازه
صفحه نمایش داشته و توسط آن css تنظیم
خواهد شد. در اینجا میتوان از * برای
بدست آورن مقدار جاری یک خصوصیت از استایل استفاده کرد:
transition('void => *', [ style({height: 0 }), animate(1000,style({ color: '*' })) ]),
انیمیشن چند مرحلهای با استفاده از Keyframes
تا اینجا تمامی انیمیشنهایی را که بررسی کردیم، یک انیمیشن یک مرحلهای بودند. در صورتیکه یک انیمیشن حرفهای، متشکل از چند مرحله گذار خواهد بود. برای انجام اینکار از تابع Keyframes استفاده میکنیم. برای مثال میخواهیم انیمیشن ورود المنت را به صورتی در نظر بگیریم که المنت در ابتدا در نقطه -75% بالاتر از مکانیکه در آنجا نمایش داده خواهد شد، با opacity صفر شروع به حرکت کرده و در مرحله بعد به نقطه 35px پائینتر از مکان اصلی خود آمده و opacity نیم را خواهد داشت و در نهایت، با حرکت بعدی به جای اصلی خود خواهد رفت و opacity یک را پیدا میکند.
animations: [ trigger('flyInOut', [ transition('void => *', [ animate(300, keyframes([ style({opacity: 0, transform: 'translateY(-75%)', offset: 0}), style({opacity: 0.5, transform: 'translateY(35px)', offset: 0.3}), style({opacity: 1, transform: 'translateY(0)', offset: 1.0}) ])) ]) ]) ]
تابع Keyframes آرایهای از تابع style را دریافت میکند که هر تابع شامل خصوصیتهای انیمیشن به همراه یه خصوصیت offset است. این خصوصیت اختیاری است و مقدار صفر تا یک را قبول میکند و بیانگر زمان اجرای تابع style بعدی است.
رخداد شروع و پایان انیمیشن
با استفاده از @triggerName.start و @triggerName.done با شروع و پایان انیمیشن خود میتوانید یک تابع سفارشی را نیز اجرا کنید. برای مثال کد زیر را در نظر بگیرید:
template: ` <ul> <li *ngFor="let hero of heroes" (@flyInOut.start)="animationStarted($event)" (@flyInOut.done)="animationDone($event)" [@flyInOut]="'in'"> {{hero.name}} </li> </ul> `,
در این مثال هنگام شروع انیمیشن تابع animationStarted و پس از اتمام انیمیشن، تابع animationDone اجرا خواهند شد.
تایپوگرافی مقدماتی بوت استرپ 4
شیوهنامههای همراه با بوت استرپ، رفتار و تنظیمات پیشفرض مرورگر را بازنویسی میکنند. این بازنویسی با فایل node_modules\bootstrap\scss\_reboot.scss شروع میشود. اگر مجموعهی بوت استرپ را توسط روش معرفی شدهی در مطلب «روشهای مختلف دریافت و نصب بوت استرپ 4» دریافت کرده باشید، کدهای کامل SASS آن، در پوشهی scss این مجموعه، موجود هستند که یکی از آنها فایل reboot است. کار آن نرمال سازی شیوهنامهها، به نحوی است که در مرورگرها مختلف و همچنین وسایل نمایشی متفاوت، یکسان به نظر برسند:
- برای مثال در این فایل از روش اندازه گیری rem استفاده شدهاست تا مدیریت اندازههای آن در سکوهای کاری مختلف قابل کنترل شود.
- در اینجا از margin-top به طور کامل صرفنظر شدهاست، تا بتوان اندازهگیری فواصل بین عناصر را بهتر محاسبه کرد. بوت استرپ 4 تنها یک margin را در پایین تمام عناصر صفحه، تنظیم میکند. بنابراین آگاهی از وجود این پیشفرض، تنظیم فواصل بین عناصر را نیز سادهتر میکند.
- در این فایل در همهجا از خاصیت inherit استفاده شدهاست تا امکان بازنویسی شیوهنامههای آن توسط custom styles ما سادهتر شود.
- پیشفرض دیگری که در این نگارش از بوت استرپ تنظیم شدهاست، border-box میباشد. به این ترتیب اندازه گیری عرض عناصر سادهتر میشوند. برای مثال اگر عرض یک div را مساوی 200px قرار دهید، یک padding پیشفرض نیز برای آن درنظر گرفته شدهاست و padding سفارشی تنظیم شدهی برای آن بیاثر خواهد بود.
- در این نگارش، فونت پیشفرض صفحه، به فونت پیشفرض سیستم تنظیم شدهاست و نه فونت از پیش تعیین شدهی خاصی. از این جهت که این قلمهای سیستمی، دارای ویژگیهای خاصی هستند که آنها را برای سکوهای کاری مختلف، منحصربفرد میکنند.
مثال: نمایش تاثیر بوت استرپ 4 بر روی تایپوگرافی پیشفرض مرورگر
<body> <div class="container"> <section class="content" id="mission"> <h1>Our Commitment <small>to you</small></h1> <p>Wisdom Pet Medicine strives to blend the best in traditional and <em>alternative medicine</em> in the <strong>diagnosis and treatment</strong> of companion animals including dogs, cats, birds, reptiles, rodents, and fish. We apply the wisdom garnered in the <mark>centuries old tradition</mark> of veterinary medicine, to find the safest treatments and cures.</p> <p>We strive to be your pet's medical <del>staff</del> experts from youth through the senior years. <small>We build preventative health care plans for each and every one of our patients, based on breed, age, and sex, so that your pet receives the most appropriate care at crucial milestones.</small> We want to give your pet a long and healthy life.</p> </section> <section class="content" id="services"> <h2>Exotic Pets</h2> <p>We offer <strong>specialized</strong> care for <em>reptiles, rodents, birds,</em> and other exotic pets.</p> <h3>Grooming</h3> <p>Our therapeutic <span>grooming</span> treatments help battle fleas, allergic dermatitis, and other challenging skin conditions.</p> <h4>General Health</h4> <p>Wellness and senior exams, ultrasound, x-ray, and dental cleanings are just a few of our general health services.</p> <h5>Nutrition</h5> <p>Let our nutrition experts review your pet's diet and prescribe a custom nutrition plan for optimum health and disease prevention.</p> <h6>Pest Control</h6> <p>We offer the latest advances in safe and effective prevention and treatment of fleas, ticks, worms, heart worm, and other parasites.</p> <h2>Vaccinations</h2> <p>Our veterinarians are experienced in modern vaccination protocols that prevent many of the deadliest diseases in pets.</p> </section> </div> </body>
با اعمال بوت استرپ
بدون اعمال بوت استرپ
در اینجا دو تصویر راملاحظه میکنید؛ یکی با اعمال bootstrap.min.css به صفحهاست و دیگری با حذف آن از صفحه. به این ترتیب مشاهده میکنید که صرفا اعمال بوت استرپ به یک صفحهی متداول، کیفیت نمایش آنرا با بازنویسی شیوهنامهی پیشفرض مرورگر، به نحو قابل ملاحظهای بهبود بخشیدهاست و آنرا زیباتر کردهاست.
در اینجا تنها المان بوت استرپی که به صفحه اضافه شدهاست و جزو استانداردهای HTML نیست، یک div با کلاس container است:
<body> <div class="container">
در این مثال تاثیر بوت استرپ را بر روی شیوهنامههای پیشفرض خصوصا h1 تا h6، مشاهده میکنید.
روش دیگر تعریف headings در اینجا، استفاده از کلاسهایی با نامهای مشابه است:
<div class="h1">Test div class H1</div>
<div class="display-1">Test div class display-1</div>
همچنین اگر نیاز به بزرگتر نمایش دادن متن قسمت ابتدایی صفحه وجود داشت، میتوان از کلاس Lead استفاده کرد:
<p class="lead">Testing a lead class</p>
کلاسهای کمکی کار با متون در بوت استرپ 4
بوت استرپ 4 به همراه تعدادی کلاس کمکی کار با متون است که نیازهای متداول تایپوگرافی را برآورده میکنند:
1) کلاسهای کمکی محل قرارگیری متون
- کلاس text-justify کار کشیدن و متناسب کردن یک پاراگراف را با گوشههای سمت چپ و راست صفحه انجام میدهد.
- کلاس text-nowrap از شکسته شدن متن به چندین سطر جلوگیری میکند. برای مثال میتواند برای نمایش کدها مناسب باشد.
- کلاس متغیر text-xx-pos برای تعیین محل قرارگیری متن کاربرد دارد:
در اینجا ذکر xx اختیاری است و میتواند sm، برای اندازههای صفحهی بیشتر از 576px و یا md، برای اندازههای صفحهی بیشتر از 768px و یا lg، برای اندازههای صفحهی بیشتر از 992px و یا xl، برای اندازههای صفحهی بیشتر از 1200px باشد. این اندازههای یاد شده را در ادامه بیشتر مشاهده خواهید کرد.
همچنین pos میتواند left ،center و یا right باشد.
برای مثال کلاس text-sm-center به این معنا است که متن مدنظر در break-point ایی به نام sm، یعنی با اندازهی صفحهی بیشتر از 576px، در وسط صفحه نمایش داده خواهد شد.
2) کلاسهای نمایش upper-case و lower-case حروف
- کلاس text-lowercase کار نمایش lower-case کل یک پاراگراف اعمالی را انجام میدهد.
- کلاس text-uppercase کار نمایش upper-case کل یک پاراگراف اعمالی را انجام میدهد.
- کلاس text-capitalize، اولین حرف هر واژه را به صورت بزرگ نمایش میدهد.
3) کلاسهای شیوهی نمایش متون
کلاس font-weight-bold، کلاس font-weight-normal و کلاس font-italic نمایش ضخیم، عادی و یا italic متن را سبب میشوند.
مثال: بررسی تاثیر کلاسهای کمکی کار با متون در بوت استرپ 4
<body> <div class="container"> <section class="content" id="mission"> <h1 class="text-center text-sm-right text-md-left text-uppercase">Our Commitment</h1> <p class="lead text-justify">Wisdom Pet Medicine strives to blend the best in traditional and <em>alternative medicine</em> in the <strong>diagnosis and treatment</strong> of companion animals including dogs, cats, birds, reptiles, rodents, and fish. We apply the wisdom garnered in the <mark>centuries old tradition</mark> of veterinary medicine, to find the safest treatments and cures.</p> <p class="text-nowrap text-capitalize">We strive to be your pet's medical <del>staff</del> experts from youth through the senior years. <small>We build preventative health care plans for each and every one of our patients, based on breed, age, and sex, so that your pet receives the most appropriate care at crucial milestones.</small> We want to give your pet a long and healthy life.</p> </section> <section class="content" id="services"> <div class="display-4">Exotic Pets</div> <p>We <span class="font-weight-bold">offer</span> <strong class="font-weight-normal">specialized</strong> care for <em>reptiles, rodents, birds,</em> and other exotic pets.</p> <h3 class="text-left text-md-center text-sm-right">Grooming</h3> <p>Our therapeutic <span>grooming</span> treatments help battle fleas, allergic dermatitis, and other challenging skin conditions.</p> <h4>General Health</h4> <p>Wellness and senior exams, ultrasound, x-ray, and dental cleanings are just a few of our general health services.</p> <h5>Nutrition</h5> <p>Let our nutrition experts review your pet's diet and prescribe a custom nutrition plan for optimum health and disease prevention.</p> <h6>Pest Control</h6> <p>We offer the latest advances in safe and effective prevention and treatment of fleas, ticks, worms, heart worm, and other parasites.</p> <h2>Vaccinations</h2> <p>Our veterinarians are experienced in modern vaccination protocols that prevent many of the deadliest diseases in pets.</p> </section> </div> </body>
در اینجا اگر کلاس text-right را به heading اضافه کنیم:
<h1 class="text-right">Our Commitment <small>to you</small></h1>
و یا میتوان این کلاسها را با هم ترکیب کرد:
<h1 class="text-center text-sm-right">Our Commitment <small>to you</small></h1>
- متن h1 در حالت عادی در وسط صفحه نمایش داده شود.
- اما متن مدنظر در break-point ایی به نام sm، یعنی با اندازهی صفحهی بیشتر از 576px، در سمت راست صفحه نمایش داده خواهد شد.
این اعداد توسط افزونهی ViewPort نمایش داده شدهاند.
همچنین تاثیر text-justify را نیز به اولین پاراگراف
<p class="lead text-justify">
و یا اگر text-nowrap را به پاراگرافی اعمال کنیم:
<p class="text-nowrap">
سبب نمایش یک سطری آن خواهد شد که در اینجا با پدید آمدن یک اسکرول بار افقی، قابل ملاحظهاست.
کلاسهای کمکی کار با لیستها و نقل قولها در بوت استرپ 4
بوت استرپ 4 به همراه کلاسهایی کمکی برای کار با لیستها و نقل قولها است؛ مانند:
- کلاس list-unstyled سبب حذف bullets از یک لیست میشود.
- برای ایجاد لیستهای Inline میتوان از کلاس list-inline بر روی المان UL و سپس list-inline-item بر روی هر LI آن، کمک گرفت.
<body> <div class="container"> <section class="content" id="services"> <h2>Exotic Pets</h2> <p>We offer <strong>specialized</strong> care for <em>reptiles, rodents, birds,</em> and other exotic pets.</p> <ul class="list-unstyled"> <li>Grooming</li> <li>General Health</li> <li>Nutrition</li> <li>Pest Control</li> <li>Vaccinations</li> </ul> <ul class="list-inline"> <li class="list-inline-item">Grooming</li> <li class="list-inline-item">General Health</li> <li class="list-inline-item">Nutrition</li> <li class="list-inline-item">Pest Control</li> <li class="list-inline-item">Vaccinations</li> </ul> </section> </div> </body>
در حالت لیست inline، آیتمهای لیست از چپ به راست در یک سطر نمایش داده میشوند. برای مثال میتواند برای نمایش breadcrumbs در یک سایت مناسب باشد.
همچنین برای نمایش نقل قولها میتوان از کلاس blockquote و برای نمایش بهتر امضای آن از کلاس blockquote-footer استفاده کرد:
<body> <div class="container"> <section class="content" id="testimonials"> <h2>Testimonials</h2> <blockquote> During the summer, our rabbit, Tonto, began to have severe redness and itching on his belly and feet. I'm very thankful to the veterinarians and staff at Wisdom for the excellent care Tonto received, and for nipping his allergies in the bud, so to speak. Jane </blockquote> <blockquote class="blockquote text-right"> When Samantha, our Siamese cat, began sleeping all the time and urinating excessively, we brought her to see the specialists at Wisdom. Now, two years later, Samantha is still free from any complications of diabetes, and her blood sugar regularly tests normal. <div class="blockquote-footer"> The McPhersons </div> </blockquote> </section> </div> </body>
در اینجا دو blockquote را مشاهده میکنید. مورد اول بدون کلاس blockquote است و دومی به همراه این کلاس و یک footer تعریف شدهاست. همچنین میتوان کلاسهایی مانند text-right را نیز به blockquote اضافه کرد.
البته در نگارش 4، حاشیهی خاکستری blockquote که در نگارش سوم آن وجود داشت، حذف شدهاست.
کار با رنگها در بوت استرپ 4
بوت استرپ، به همراه تعدادی کلاس مخصوص رنگها است که از آن در همه جا استفاده میکند؛ مانند رنگهای دکمهها، پس زمینهها و متون.
1) کلاسهای تعیین رنگ متون:
برای مثال در اینجا بجای Color میتوان یکی از ثوابت ذیل آنرا قید کرد؛ مانند text-primary و یا text-danger
این کلاسها برای تعیین رنگ متون و همچنین لینکها کاربرد دارند.
2) کلاسهای تعیین رنگ پس زمینه:
در اینجا برای نمونه بجای Color میتوان یکی از ثوابت ذیل آنرا قید کرد؛ مانند bg-primary و یا bg-danger
مثال: اعمال رنگهای زمینهای بوت استرپ
<body> <div class="container"> <section class="content" id="services"> <h2 class="text-danger">Our Mission</h2> <p class="bg-danger text-white">Wisdom Pet Medicine strives to blend the best in traditional and alternative medicine in the diagnosis and treatment of companion animals including dogs, cats, birds, reptiles, rodents, and fish. We apply the wisdom garnered in the centuries old tradition of veterinary medicine, to find the safest treatments and cures.</p> <ul> <li><a class="text-warning" href="#">Grooming</a></li> <li><a href="#">General Health</a></li> <li><a href="#">Nutrition</a></li> <li><a href="#">Pest Control</a></li> <li><a href="#">Vaccinations</a></li> </ul> </section> <section class="content" id="testimonials"> <h2>Testimonials</h2> <blockquote class="blockquote bg-faded text-info"> During the summer, our rabbit, Tonto, began to have severe redness and itching on his belly and feet. I'm very thankful to the veterinarians and staff at Wisdom for the excellent care Tonto received, and for nipping his allergies in the bud, so to speak. <div class="blockquote-footer"> Jane </div> </blockquote> </section> </div> </body>
در اینجا مثالهایی را از اعمال کلاسهای رنگهای بوت استرپ مشاهده میکنید. همچنین امکان ترکیب آنها مانند مثال زیر نیز وجود دارد:
<p class="bg-danger text-white">
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید: Bootstrap4_02.zip
using Microsoft.Data.Entity; using Microsoft.Data.Entity.Metadata; using System.Collections.Generic; using System.Linq; namespace UsingEF7WithSQLite { public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } }
PM> Install-Package EntityFramework.SQLite –Pre
namespace UsingEF7SQLiteProvider { public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptions builder) { builder.UseSQLite(@"Data Source=.\BloggingDatabae.db"); } protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Blog>() .OneToMany(b => b.Posts, p => p.Blog) .ForeignKey(p => p.BlogId); // The EF7 SQLite provider currently doesn't support generated values // so setting the keys to be generated from developer code builder.Entity<Blog>() .Property(b => b.BlogId) .GenerateValueOnAdd(false); builder.Entity<Post>() .Property(b => b.BlogId) .GenerateValueOnAdd(false); } } }
Install-Package EntityFramework.Commands -Pre
Add-Migration MyFirstMigration Apply-Migration
using (var db = new BloggingContext()) { db.Database.AsMigrationsEnabled().ApplyMigrations(); }
using (var db = new Models.BloggingContext()) { db.Blogs.Add(new Models.Blog { Url = "https://www.dntips.ir" }); db.SaveChanges(); foreach (var item in db.Blogs) { Console.WriteLine(item.Url); } } Console.ReadLine();