15

Tôi đã tạo lớp dữ liệu của mình với mã EF 6 đầu tiên và tôi đang điền db qua phương thức Seed của lớp EvInitializer kế thừa từ DropCreateDatabaseIfModelChanges. Việc thực hiện Seed phương pháp làTạo người dùng Asp.net Identity trong phương thức Seed của Db Initializer

protected override void Seed(EvContext context) 
{ 
    //Add other entities using context methods 
    ApplicationUserManager manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context)); 
    var user = new ApplicationUser { Email = "[email protected]" ,UserName = "[email protected]"}; 
    var result = await manager.CreateAsync(user, "Temp_123");//this line gives error. obviously await cannot be used in non- async method and I cannot make Seed async 
} 

Câu hỏi của tôi là làm thế nào tôi có thể thêm một người dùng trong Seed phương pháp sử dụng UserManager lớp. khi tôi thay đổi var result = awit manager.CreateAsync(user, "Temp_123");
để
var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
treo ứng dụng vô thời hạn

Trả lời

18

Trong asp.net-sắc-2 UserManager có phương pháp async không để tạo ra.

var user = new ApplicationUser { Email = "[email protected]", UserName = "[email protected]" }; 
manager.Create(user, "Temp_123"); 

Tương tự cho rolemanager nếu bạn muốn tạo vai trò "quản trị".

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 
roleManager.Create(new Role("admin")); 

làm cho quản trị người dùng

manager.AddToRole(user.Id, "admin"); 

Edit: Theo trailmax nhận xét, Create() phương pháp khuyến nông do thỏa thuận với Microsoft.AspNet.Identity namespace vì vậy đừng quên using Microsoft.AspNet.Identity

+0

Không có phương thức 'manager.Create'. Tôi đã kiểm tra từ gói nuget đã cài đặt của mình và tôi có phiên bản 2.1.0 của 'Microsoft.AspNet.Identity.Core'. Ý tưởng nào? –

+0

Tôi có phiên bản 2.1.0 trong dự án của mình và tôi có thể điều hướng đến 2 phương pháp mở rộng đó. Có thể thử cài đặt lại các gói – tmg

+0

Ok, hãy để tôi thử điều đó và tôi sẽ cập nhật các chủ đề sau đó –

7

TMG là đúng - có phi async phương pháp có sẵn và đó là cách dễ nhất trong trường hợp cụ thể này. Tuy nhiên, nói chung, khi bạn chỉ có một phiên bản không đồng bộ của một chức năng có sẵn cho bạn và bạn không thể thay đổi việc triển khai phương thức thành Không đồng bộ - bạn có thể tạo một nhiệm vụ và đợi nó một cách đồng bộ.

Vì vậy - thay vì:

IdentityResult result = await manager.CreateAsync(user, "Temp_123"); 

Bạn có thể mã:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123"); 
createTask.Wait(); 

Khi Chờ đã kết thúc, IdentityResult được trả lại trong

createTask.Result 

Bạn cũng có thể thiết lập một thời gian chờ trên Wait, như sau:

Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123"); 
if (!createTask.Wait(5000)) // Wait up to 5 seconds 
{ 
    // We've timed out waiting - Do some error handling 
} 
else if (!createTask.Result.Succeeded) 
{ 
    // Creating the user failed - Do some error handling 
} 
Các vấn đề liên quan