【问题标题】:An error occurred while calling method 'BuildWebHost' on class 'Program'在类“程序”上调用方法“BuildWebHost”时发生错误
【发布时间】:2018-08-21 04:36:34
【问题描述】:

当我运行dotnet ef migrations add Initial_Identity 时,我得到了这个错误:

在类上调用方法“BuildWebHost”时发生错误 '程序'。在没有应用程序服务提供商的情况下继续。错误: GenericArguments1, 'Microsoft.AspNetCore.Identity.IdentityRole', on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' 违反了“TRole”类型的约束。一个手术被架起 这可能会导致数据丢失。请查看迁移 准确性。

我该如何解决?

这是我的代码:

启动类

public void ConfigureServices(IServiceCollection services)
{
    // some codes
    services.AddIdentity<User, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
}

程序类

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseDefaultServiceProvider(options => options.ValidateScopes = false)
            .Build();
}

TemporaryDbContextFactory 类

public class TemporaryDbContextFactory : 
IDesignTimeDbContextFactory<ApplicationDbContext>
{
    //////// 
    public ApplicationDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
            .AddJsonFile("appsettings.json")
            .Build();

        builder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
        return new ApplicationDbContext(builder.Options);
    }
}

ApplicationDbContext 类

public class ApplicationDbContext : IdentityDbContext<User, CustomRole, int,   CustomUserClaim, CustomUserRole, CustomUserLogin, CustomRoleClaim,   CustomUserToken>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {

    }

// some codes
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CustomUserLogin>().HasKey(a => new { a.UserId });
        modelBuilder.Entity<CustomUserRole>().HasKey(a => new { a.RoleId, a.UserId });
        modelBuilder.Entity<CustomUserToken>().HasKey(a => new { a.UserId});
    }

 // some codes

        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<CustomRole>().ToTable("Role");
        modelBuilder.Entity<CustomRoleClaim>().ToTable("RoleClaim");
        modelBuilder.Entity<CustomUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<CustomUserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<CustomUserRole>().ToTable("UserRole");
        modelBuilder.Entity<CustomUserToken>().ToTable("UserToken");

}

与身份相关:

public class CustomUserLogin : IdentityUserLogin<int> { }
public class CustomUserRole : IdentityUserRole<int> { }
public class CustomUserToken : IdentityUserToken<int> { }
public class CustomRole : IdentityRole<int> { }
public class CustomRoleClaim : IdentityRoleClaim<int> { }
public class CustomUserClaim : IdentityUserClaim<int> { }
public class User : IdentityUser<int> { }

更新 1:问题已更新!

根据Tao's answer,我更正了我的代码。现在黄色错误解决了,但现在出现了红色错误!

我该如何解决这个错误?

值不能为空。参数名称:连接字符串

包含 appsettings.json 文件:

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source='';initial catalog=Jahan-Beta;User ID=sa;password=''; Persist Security Info=True; Encrypt=False;TrustServerCertificate=False; MultipleActiveResultSets=True"
  }
}

我还将 appsettings.json 复制到 \bin\Debug\netcoreapp2.0 目录中。

【问题讨论】:

    标签: asp.net entity-framework-core asp.net-core-2.0 entity-framework-migrations ef-core-2.0


    【解决方案1】:

    由于您从IdentityDbContext&lt;User, CustomRole, int, CustomUserClaim, CustomUserRole, CustomUserLogin, CustomRoleClaim, CustomUserToken&gt; 继承了ApplicationDbContext,因此您应该使用CustomRole 而不是IdentityRoleAddIdentity

    services.AddIdentity<User, CustomRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2011-06-21
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多