استفاده از جدولهای Identity در بانک اطلاعاتی که جداول Identity ندارد.

12/22/2016 MVC
2112

در پروژه ای مجبور شدم بانک اطلاعاتی ازنرم افزار WPF  را که تعداد زیادی عضو داشت را به صورت وب در اورم ، و از سوی دیگر تمامی اعضاء لازم است لوگین Login  کنند، خوب لازم بود تا تمامی اعضاء را به جدول aspUser  اضافه کنم،

برای اینکه در مورد مشکلاتی که در Database First  به آن برخوردم در پست قبلی توضیح دادم .

در ابتدا لازم است تا جدولهای پیش فرض را به لیست جداول اضافه کنیم برای این کار به پروژه که از نوع Database First  هست را اضافه کنید

لیست جداول به این صورت است

  • AspNetUsers
  • AspNetRoles
  • AspNetUserClaim
  • AspNetUserLogins
  • AspNetUserRoles

برای اضافه کردن این جداول لازم است تا Migration را در Neuget  فعال کنید و یک migration جدید نیز اضافه نمایید

دستورات به این صورت خواهد بود

pm> Enable-migrations
pm> add-migration initialMyTables

بعد از هر خط یک بار Enter را میزنیم تا دستور اجرا شود.

حال در پوشه Migration یک فایل که ابتدا با عدد شروع میشود و در انتها نام initialMyTable  قرار دارد

اطلاعا ت آن را پاک کنید و با کد زیر جایگزین کنید

 public override void Up()
        {

            CreateTable(
                "dbo.AspNetRoles",
                c => new
                    {
                        Id = c.String(nullable: false, maxLength: 128),
                        Name = c.String(nullable: false, maxLength: 256),
                    })
                .PrimaryKey(t => t.Id)
                .Index(t => t.Name, unique: true, name: "RoleNameIndex");
            
            CreateTable(
                "dbo.AspNetUserRoles",
                c => new
                    {
                        UserId = c.String(nullable: false, maxLength: 128),
                        RoleId = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => new { t.UserId, t.RoleId })
                .ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
                .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                .Index(t => t.UserId)
                .Index(t => t.RoleId);
            
              
            
            CreateTable(
                "dbo.AspNetUsers",
                c => new
                    {
                        Id = c.String(nullable: false, maxLength: 128),
                        Email = c.String(maxLength: 256),
                        EmailConfirmed = c.Boolean(nullable: false),
                        PasswordHash = c.String(),
                        SecurityStamp = c.String(),
                        PhoneNumber = c.String(),
                        PhoneNumberConfirmed = c.Boolean(nullable: false),
                        TwoFactorEnabled = c.Boolean(nullable: false),
                        LockoutEndDateUtc = c.DateTime(),
                        LockoutEnabled = c.Boolean(nullable: false),
                        AccessFailedCount = c.Int(nullable: false),
                        UserName = c.String(nullable: false, maxLength: 256),
                    })
                .PrimaryKey(t => t.Id)
                .Index(t => t.UserName, unique: true, name: "UserNameIndex");
            
            CreateTable(
                "dbo.AspNetUserClaims",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        UserId = c.String(nullable: false, maxLength: 128),
                        ClaimType = c.String(),
                        ClaimValue = c.String(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                .Index(t => t.UserId);
            
            CreateTable(
                "dbo.AspNetUserLogins",
                c => new
                    {
                        LoginProvider = c.String(nullable: false, maxLength: 128),
                        ProviderKey = c.String(nullable: false, maxLength: 128),
                        UserId = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
                .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                .Index(t => t.UserId);
            
        }
        
        public override void Down()
        {
            DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers");
            DropForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers");
            DropForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers");
           
            DropForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles");
            DropIndex("dbo.AspNetUserLogins", new[] { "UserId" });
            DropIndex("dbo.AspNetUserClaims", new[] { "UserId" });
            DropIndex("dbo.AspNetUsers", "UserNameIndex");
         
            DropIndex("dbo.AspNetUserRoles", new[] { "RoleId" });
            DropIndex("dbo.AspNetUserRoles", new[] { "UserId" });
            DropIndex("dbo.AspNetRoles", "RoleNameIndex");
            DropTable("dbo.AspNetUserLogins");
            DropTable("dbo.AspNetUserClaims");
            DropTable("dbo.AspNetUsers");
          
           
            DropTable("dbo.AspNetUserRoles");
            DropTable("dbo.AspNetRoles");
           
        }

و در nuget  دستور 

pm> Update-database

را اجرا کنید

 

در تمام این مدت به یاد داشته باشید در فایل Configuration.cs 

AutomaticMigrationsEnabled = false;

باشد،

در ادامه میخواهیم کاربرانی که در جدول tblmember  هستند را به جدول aspUser  اضافه کنند تا با نام کاربری و کلمه عبور که به صورت پیشفرض  کد ملی خواهد بود، وارد حساب کاربری شود

 public async Task<ActionResult> RegisetrAllUser()
        {
            ApplicationDbContext db = new ApplicationDbContext();
            IList<string> errorList = null;
            var memberList = db.tblMembers.Where(x=>x.RealMember).ToList();
            var rvm = new RegisterViewModel();
            foreach (var item in memberList)
            {
                rvm.Email = item.NationalCode + "@gmail.com";
                rvm.Password = item.NationalCode.ToString();
                var user = new ApplicationUser { UserName = rvm.Email, Email = rvm.Email };
                var result = await UserManager.CreateAsync(user, rvm.Password);
                if (!result.Succeeded)
                {
                    errorList.Add(rvm.Password);
                }
            }
            return View();
        }

 و برای اجرای آن این لینک را در View  جایگذاری میکنیم

<p>
    @Html.ActionLink("RegisterAsUser", "RegisetrAllUser","Account")
</p>