Error CS1061 'IdentityBuilder' does not contain a definition for 'AddEntityFrameworkStores'

你说的曾经没有我的故事 提交于 2020-01-23 06:08:26

问题


I'm trying to change the primary key in ASPNET Core 2.0 to Guid or long.

I've tried the following examples in both these links Link1 and Link2

However, in the Startup class I get the following error

 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?)

I think the reason is the examples are based on the older ASPNET Core 1.0. How can I change the primary key for Identity in ASPNET Core 2.0?


回答1:


Credit on how to do this can be found in the comments in this link 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();

If using Guid then replace builder.Entity<ApplicationUser>().Property(p => p.Id).UseSqlServerIdentityColumn(); with builder.Entity<ApplicationUser>().Property(p => p.Id).ValueGeneratedOnAdd();

All changes are below

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());



回答2:


I solved this by changing my ApplicationDbContext to inherit from IdentityDbContext<ApplicationUser>



来源:https://stackoverflow.com/questions/46671570/error-cs1061identitybuilder-does-not-contain-a-definition-for-addentityframe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!