2017-10-10 96 views
3

我试图将ASPNET Core 2.0中的主键更改为Guidlong错误CS1061 t'IdentityBuilder'不包含'AddEntityFrameworkStores'的定义

我已经在这两个环节 Link1Link2尝试下面的例子

然而,在启动类我收到以下错误

Error CS1061 'IdentityBuilder' does not contain a definition for 
'AddEntityFrameworkStores' and no extension method 'AddEntityFrameworkStores' accepting 
a first argument of type 'IdentityBuilder' could be found (are you missing a using 
directive or an assembly reference?) 

enter image description here

我想原因是基于较旧的ASPNET Core 1.0的例子。我如何在ASPNET Core 2.0中更改Identity的主键?如何做到这一点

+0

我有同样的问题。你找到了解决办法吗? – devC

回答

2

信用可以在评论在这个环节https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

Change ApplicationUser to inherit from IdentityUser<int> 

Create a new class ApplicationRole that inherits from IdentityRole<int> 

Change ApplicationDbContext to inherit from IdentityDbContext<ApplicationUser, ApplicationRole, int> 

Change startup.cs for services.AddIdentity to use ApplicationRole 

Change UrlHelperExtensions methods to take a generic <T> with T userId in the signature 

Change ManageController's LinkLoginCallback's call to await _signInManager.GetExternalLoginInfoAsync(user.Id.ToString()) 

Add the following line to the ApplicationDbContext OnModelCreating method (after the base.OnModelCreating call) 

builder.Entity<ApplicationUser>().Property(p => p.Id).UseSqlServerIdentityColumn(); 

发现如果使用Guid然后用builder.Entity<ApplicationUser>().Property(p => p.Id).ValueGeneratedOnAdd();

更换builder.Entity<ApplicationUser>().Property(p => p.Id).UseSqlServerIdentityColumn();所有变化都低于

public class ApplicationUser : IdentityUser<Guid> 
{ 
} 

public class ApplicationRole : IdentityRole<Guid> 
{ 

} 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid> 
{ 
    Public ApplicationDbContext(DbContextOptions <ApplicationDbContext> Options): Base (Options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 

     // For Guid Primary Key 
     builder.Entity<ApplicationUser>().Property(p => p.Id).ValueGeneratedOnAdd(); 

     // For int Primary Key 
     //builder.Entity<ApplicationUser>().Property(p => p.Id).UseSqlServerIdentityColumn(); 
    } 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddIdentity<ApplicationUser, ApplicationRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

    // Add application services. 
    services.AddTransient<IEmailSender, EmailSender>(); 

    services.AddMvc(); 
} 

public static class UrlHelperExtensions 
{ 
    public static string EmailConfirmationLink<T>(this IUrlHelper urlHelper, T userId, string code, string scheme) 
    { 
     return urlHelper.Action(
      action: nameof(AccountController.ConfirmEmail), 
      controller: "Account", 
      values: new { userId, code }, 
      protocol: scheme); 
    } 

    public static string ResetPasswordCallbackLink<T>(this IUrlHelper urlHelper, T userId, string code, string scheme) 
    { 
     return urlHelper.Action(
      action: nameof(AccountController.ResetPassword), 
      controller: "Account", 
      values: new { userId, code }, 
      protocol: scheme); 
    } 
} 

.... 
var info = await _signInManager.GetExternalLoginInfoAsync(user.Id.ToString()); 
相关问题