asp.net - 向 User 类添加属性违反了 TContext 类型的约束

标签 asp.net entity-framework identity entity-framework-migrations

我正在尝试向我的 ApplicationUser 类添加属性,但在添加属性后更新数据库时遇到问题。我究竟做错了什么?我想做的就是将声明的结果存储在 User 对象中,以便我可以更轻松地访问它。

我正在尝试使用以下方式更新数据库:EntityFrameworkCore\Add-Migration -Name ApplicationDbContext

每当我运行命令时,我都会在 NuGet 包管理器中运行它。我还尝试通过项目文件夹内的命令提示符运行命令(没有成功和类似的错误输出)。

版本信息:

  • Entity Framework Core 和 Entity Framework 6 均已安装。 Entity Framework Core 工具正在运行。我用 EntityFrameworkCore\

  • 作为命令的前缀
  • dotnet --version 2.1.101

错误

GenericArguments[0], 'MyWebsite1.Data.Migrations.ApplicationDbContext', on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.

我的ApplicationUser类:

 public class ApplicationUser : IdentityUser
    {
        public string LGID { get; } = "";
        public string CoIDs { get; } = "";
        public string LGIDSuperUserName { get; set; } = "unknown"; //recently added
        public bool IsSuperUser { get; set; } = false; //recently added

        public ApplicationUser() { }

        public ApplicationUser(ClaimsIdentity identity)
        {
            IEnumerable<Claim> claims = identity.Claims;
            foreach (Claim c in claims)
            {
                if (c.Type == "LGID")
                    LGID = c.Value;
                if (c.Type == "CoIDs")
                    CoIDs = c.Value;
                if (c.Type == "LGIDSuperUser")
                    LGIDSuperUserName = c.Value;
                if (c.Type == "IsSuperUser")
                    IsSuperUser = c.Value.ToLower()=="yes";
            }
        }
    }

这是 ApplicationDbContext 中的 Up 方法:迁移:

   protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropIndex(
            name: "UserNameIndex",
            table: "AspNetUsers");

        migrationBuilder.DropIndex(
            name: "IX_AspNetUserRoles_UserId",
            table: "AspNetUserRoles");

        migrationBuilder.DropIndex(
            name: "RoleNameIndex",
            table: "AspNetRoles");

        migrationBuilder.AddColumn<bool>(
            name: "IsSuperUser",
            table: "AspNetUsers",
            nullable: false,
            defaultValue: false);

        migrationBuilder.AddColumn<string>(
            name: "LGIDSuperUserName",
            table: "AspNetUsers",
            nullable: true);

        migrationBuilder.CreateIndex(
            name: "UserNameIndex",
            table: "AspNetUsers",
            column: "NormalizedUserName",
            unique: true,
            filter: "[NormalizedUserName] IS NOT NULL");

        migrationBuilder.CreateIndex(
            name: "RoleNameIndex",
            table: "AspNetRoles",
            column: "NormalizedName",
            unique: true,
            filter: "[NormalizedName] IS NOT NULL");

        migrationBuilder.AddForeignKey(
            name: "FK_AspNetUserTokens_AspNetUsers_UserId",
            table: "AspNetUserTokens",
            column: "UserId",
            principalTable: "AspNetUsers",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    }

应用程序DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    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);
    }
}

我的 .csproj 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <_SelectedScaffolderID>MvcControllerWithContextScaffolder</_SelectedScaffolderID>
    <_SelectedScaffolderCategoryPath>root/Common</_SelectedScaffolderCategoryPath>
    <WebStackScaffolding_ControllerDialogWidth>600</WebStackScaffolding_ControllerDialogWidth>
    <WebStackScaffolding_DbContextDialogWidth>600</WebStackScaffolding_DbContextDialogWidth>
    <WebStackScaffolding_ViewDialogWidth>600</WebStackScaffolding_ViewDialogWidth>
    <WebStackScaffolding_IsLayoutPageSelected>False</WebStackScaffolding_IsLayoutPageSelected>
    <WebStackScaffolding_IsPartialViewSelected>False</WebStackScaffolding_IsPartialViewSelected>
    <WebStackScaffolding_IsReferencingScriptLibrariesSelected>False</WebStackScaffolding_IsReferencingScriptLibrariesSelected>
    <ActiveDebugProfile>IIS Express</ActiveDebugProfile>
    <NameOfLastUsedPublishProfile>FolderProfile</NameOfLastUsedPublishProfile>
    <Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
    <Controller_SelectedScaffolderCategoryPath>root/Controller</Controller_SelectedScaffolderCategoryPath>
    <WebStackScaffolding_IsAsyncSelected>False</WebStackScaffolding_IsAsyncSelected>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
  </PropertyGroup>
<DotNetCliToolReference   
Include="Microsoft.EntityFrameworkCore.Tools.DotNet"
Version=”1.0.0” />
</Project>

正如我所关注的那样here当我尝试:dotnet ef migrations add superuser_test时,我得到:dotnet:没有找到匹配命令“dotnet-ef”的可执行文件尽管我的.csproj中有DotNetCliToolReference并运行:dotnet 恢复

我的迁移: enter image description here

最佳答案

您的ApplicationDbContext应该实现IDesignTimeDbContextFactory<ApplicationDbContext>接口(interface)检查Design-time DbContext Creation

ApplicationDbContext应该看起来像

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDesignTimeDbContextFactory<ApplicationDbContext>
{

    public ApplicationDbContext() { }

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

    public ApplicationDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS; Database=TestEfCore; Trusted_Connection=True;");

        return new ApplicationDbContext(optionsBuilder.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);
    }   
}

也可以运行dotnet ef你的 projectfile.csproj 应该有 bwlow

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0-preview1-final" />
  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview1-final" />
</ItemGroup>

然后open cmd at your project path并运行

dotnet restore
dotnet ef

关于asp.net - 向 User 类添加属性违反了 TContext 类型的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50006116/

相关文章:

c# - 仅更新 html 时,ASP.NET Razor View 不会更新

c# - 在负载平衡环境中将 javascript/css 请求定向到与页面相同的服务器

entity-framework - EF 代码优先 : Get all POCO types for DbContext

c# - 在 Entity Framework 中计数

java - 将身份和访问管理与 Java 结合使用

asp.net - 缓存 WCF 服务并将数据转换为异步

c# - 为不同项目中的上下文启用项目迁移

.net - GCP 工作负载与 Azure 联合身份验证

asp.net - IE 和 ASP.NET 的 IPv6 范围 ID 问题

c# - 为什么程序集似乎被引用但实际上没有