در پروژه ای مجبور شدم بانک اطلاعاتی ازنرم افزار 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>