در طراحی های پروژه های MVC همواره توصیه میشود از CodeFirst استفاده کنیم ، چرا آن را در بسیاری از سایتهای ایرانی میتوانید ببینید، اما گاهی لازم میشود پروژه های قدیمی را در سیستم جدید استفاده کنید
عموما برای استفاده از پروژه ها همیشه یک تمپلت پیشفرض استفاده میکنم که همیشه سعی در تکمیل آن دارم ، در پیشفرض DbContext از ApplicationDbContext استفاده میشود و گر از تصمیم داشته باشید کدها را به صورت اتوماتیک از بانک اطلاعاتی خود Entity بسازد یک Context جدید ایجاد خواهد کرد که مدیریت این دو می تواند مشکل ایجاد کند. برا ی همین چند کار کوچک انجام دام تا از همان Context پیشفرض استفاده شود.
پیش فرض این است که شما با Database First اشنایی کامل دارید و در صورتی که اطلاع چندانی ندارید میتوانید از سایت مرجع آن اطلاع کسب کنید
ابتدا اینکه کلاسهای اتوماتیک که قرار است توسط Entity ساخته شود را درون پوشه Models ساخته شود به این صورت که روی پوشه Model راست کلیک کنید. و اجازه دهید کدها در درون کلاس Models ساخته شوند.
در web.config دو ConnectionString خواهید داشت connectionstring پیشفرض را پاک کنید و نام connection را به connectionString قدیمی (DefaultConnection) تغییر نام دهید
در فایل که هم نام entity جدید ساخته شده را باز کنید و زیر مجموعه کلاس OnModelCreating و تمامی DBSet ها را کپی کنید و در کلاس IdentityModels جایگذاری کنید.
کلاس هم نام مدلی که در زمان اتصال به بانک ساخته اید را پاک کنید
تااینجا شما یک Context که همان ApplicationDbContext است را دارید.
حال میتوانید به راحتی کنترلها را اضافه کنید. برای ایجاد تغییر در بانک اطلاعاتی یکی از راهها در MVC استفاده از Migration است برای ان کا رکافی است در PackageManger خود بنویسید
enable-migration
در صورتی که در پاهای Context که شما اضافه کرده اید پاک کرده باشید خطا مربوط به داشتن دو Context را نخواهید داشت اما اگر رد پاها را پاک نکرده باشید PackageManger شما از شما نیخواهد که نام Context را بعد از Enable-migration اضافه کنید
و ادامه خواد داشت در ادامه خطایی ریافت میکنید که
One or more validation errors were detected during model generation:
ProjectName.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType.
ProjectName.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.
برای رفع این خطا دو راه حل دارید راه اول اینکه قطعه کد زیر را به OnModelCreating اضافه کنید
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
و راه دوم اینکه به جای قطعه کد بالا این قطعه کد را جایگذین کنید
base.OnModelCreating(modelBuilder);