【问题标题】:Trying to AddIdentity to WebApi .NetCore, wont allow me to add IdentityDbContext尝试将身份添加到 Web Api .Net Core,不允许我添加 IdentityDbContext
【发布时间】:2021-03-26 04:51:31
【问题描述】:

所以我将我的服务注入到我正在做的 Web API 的 Startup.cs 中。我有两个上下文,SubscriptionDbContextApplicationDbContext(Identity)。我正在尝试使用上下文配置 AddIdentity 并引发此错误。 -

类型“Rad302me2021WebAPIS00187127.Data.ApplicationDbContext” 不能用作泛型类型中的类型参数“TContext”或 方法 'IdentityEntityFrameworkBuilderExtensions.AddEntityFrameworkStores(IdentityBuilder)'。 没有隐式引用转换 'Rad302me2021WebAPIS00187127.Data.ApplicationDbContext' 到 'Microsoft.EntityFrameworkCore.DbContext'。 Rad302me2021WebAPIS00187127

现在我知道ApplicationDbContext 必须继承 DbContext,但我正在使用IdentityDbContext,因为这是我在另一个示例中看到的。

这就是我添加它的方式:

services.AddIdentity<ApplicationUser, IdentityRole>(cfg =>
            {
                cfg.User.RequireUniqueEmail = true;
            }).AddEntityFrameworkStores<ApplicationDbContext>();

这似乎也导致了进一步注入上下文的问题

services.AddDbContext<ApplicationDbContext>();

类型“Rad302me2021WebAPIS00187127.Data.ApplicationDbContext” 不能用作泛型类型中的类型参数“TContext”或 方法 'EntityFrameworkServiceCollectionExtensions.AddDbContext(IServiceCollection, 行动、服务生命周期、服务生命周期)'。 没有隐式引用转换 'Rad302me2021WebAPIS00187127.Data.ApplicationDbContext' 到 'Microsoft.EntityFrameworkCore.DbContext'。

只是对 Core API 还不是很熟悉,所以它仍然是一个学习曲线。

ApplicationDbContext 类

using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.EntityFrameworkCore;
using Rad302me2021DataLayerS00187127.Models;

namespace Rad302me2021WebAPIS00187127.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public DbSet<ApplicationUser> ApplicatonUsers { get; set; }

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }
}

应用用户类

using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rad302me2021DataLayerS00187127.Models
{
    public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string SecondName { get; set; }
        public string Role { get; set; }
    }
}

我有另一个样本可以与相同的软件包完美配合。不太确定我错了

【问题讨论】:

  • 您能分享一下您是如何声明您的ApplicationDbContext 班级的吗?
  • 在那里添加了类
  • 添加到那里的ApplicationDbContext类中

标签: asp.net-core asp.net-web-api entity-framework-core


【解决方案1】:

也许问题与实体框架包有关。您使用的包可能是 .net Framework 版本,而不是 .net 核心版本,或者您没有在 ApplicationDbContext.cs 和 Startup.cs 文件中添加正确的包引用。请参考以下示例代码,然后检查并更新您的代码:

首先,打开 NeGet 包管理器,安装以下包:

然后,ApplicationDbContext.cs 中的代码如下:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace WebApplication1.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }
}

Startup.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using WebApplication1.Data;

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDatabaseDeveloperPageExceptionFilter();

            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();
            services.AddControllersWithViews();
        }

截图如下:

【讨论】:

  • 还是同样的错误,不知道到底是什么原因造成的The type 'Rad302me2021WebAPIS00187127.Data.ApplicationDbContext' cannot be used as type parameter 'TContext' in the generic type or method 'EntityFrameworkServiceCollectionExtensions.AddDbContext&lt;TContext&gt;(IServiceCollection, Action&lt;DbContextOptionsBuilder&gt;, ServiceLifetime, ServiceLifetime)'. There is no implicit reference conversion from 'Rad302me2021WebAPIS00187127.Data.ApplicationDbContext' to 'Microsoft.EntityFrameworkCore.DbContext'.
  • 嗨@RonanDuffy,问题与Microsoft.AspNet.Identity.EntityFramework 包(在ApplicationDbContext.cs 和ApplicationUser.cs 文件中)有关,该包用于实体框架,而不是实体框架核心。因此,卸载Microsoft.AspNet.Identity.EntityFramework 包,然后安装Microsoft.AspNetCore.Identity.EntityFrameworkCore。然后在 ApplicationDbContext.cs 和 ApplicationUser.cs 文件中,将 using Microsoft.AspNet.Identity.EntityFramework; 更改为 using Microsoft.AspNetCore.Identity.EntityFrameworkCore;。可以参考上面的回复。
【解决方案2】:

您继承的IdentityDbContext 使用默认的IdentityUser 作为用户模型。由于您的用户模型扩展了默认的IdentityUser,因此您需要从IdentityDbContext&lt;TUser&gt; 继承并在覆盖的OnModelCreating() 中调用base.OnModelCreating() -

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

另外,我不确定您打算如何注册 ApplicationDbContext 与 -

services.AddDbContext<ApplicationDbContext>();

但您应该按照此处所示注册您的两个上下文 - DbContext in dependency injection for ASP.NET Core

【讨论】:

  • ApplicationDbContext 和 AddDbContext 有什么问题,它应该可以工作吗?
  • @RonanDuffy 不,不应该。你需要告诉这个上下文应该针对哪个数据库。你没有通过services.AddDbContext&lt;SubscriptionDbContext&gt;(); 配置你的其他上下文,是吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-23
  • 2018-03-01
  • 2021-08-28
  • 2021-08-02
  • 2020-12-14
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多