استفاده از database که قبلا وجود دارد در MVC

12/18/2016 MVC
1545

در طراحی های پروژه های 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);