实体类型“Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<string>”需要定义一个键

Posted

技术标签:

【中文标题】实体类型“Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<string>”需要定义一个键【英文标题】:The entity type 'Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<string>' requires a key to be defined 【发布时间】:2015-11-30 13:45:22 【问题描述】:

我有一个使用 EF7 的 ASP.NET5 MVC 应用程序。到目前为止一切正常,我可以在数据库中添加迁移和持久化数据。 现在,将 Identity 添加到我的数据层项目后,在尝试添加新迁移时出现此错误:

实体类型 'Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin' 需要定义一个键

我的上下文是从 IdentityDbContext 派生的:

public class ASSWebApiContext : IdentityDbContext<AppUser>

AppUser 类:

using Microsoft.AspNet.Identity.EntityFramework;
using System;

namespace ASS.DomainDataModel.Models

    public class AppUser : IdentityUser
    
        public string AppUserId  get; set; 
        public DateTime FirstFlight  get; set; 
    

项目.json


  "version": "1.0.0-*",
  "description": "ASS.DomainDataModel Class Library",
  "authors": [ "xxxx" ],
  "tags": [ "" ],
  "projectUrl": "",
  "licenseUrl": "",

  "frameworks": 
    "dnx451": 
      "dependencies": 
      
    ,
    "dnxcore50": 
      "dependencies": 
      
    
  ,

  "dependencies": 
    "ASS.DomainClasses": "1.0.0-*",
    "Microsoft.Extensions.PlatformAbstractions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "EntityFramework.Core": "7.0.0-rc1-final",
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.Relational": "7.0.0-rc1-final",
    "System.Linq.Expressions": "4.0.11-beta-23516",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final"
  ,

    "commands": 
    "ef": "EntityFramework.Commands"
  

我在这里所做的只是加载相关的新包: “Microsoft.AspNet.Identity.EntityFramework”:“3.0.0-rc1-final”,添加了 AppUser 类 - 仅此而已。我有一个使用 beta-8 的类似项目,使用完全相同的模式,它可以毫无问题地工作。 beta-8 和 rc-1 之间有什么相关的变化吗?

谢谢!

下面是 ASSWebApiContext 的一部分。大多数具有 DbSet 的实体都有一个 modelBuilder.Entity。所以文件持续了很长一段时间......

using Microsoft.Data.Entity;
using ASS.DomainClasses.Entities;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.PlatformAbstractions;
using System.Linq;
using ASS.DomainClasses.Interfaces;
using System;
using Microsoft.AspNet.Identity.EntityFramework;

namespace ASS.DomainDataModel.Models

    public class ASSWebApiContext : IdentityDbContext<AppUser>
    
        public IConfigurationBuilder Config  get; set; 
        public IConfigurationRoot _Configuration  get; private set; 

        public ASSWebApiContext(IApplicationEnvironment appEnv)
        
            Database.EnsureCreated();

            Config = new ConfigurationBuilder()
                .SetBasePath(appEnv.ApplicationBasePath)
                .AddJsonFile("config.json");

            _Configuration = Config.Build();

        

        public DbSet<Address> Addresses  get; set; 
        public DbSet<AddressType> AddressTypes  get; set; 
        public DbSet<Aircraft> Aircrafts  get; set; 
        public DbSet<AircraftModel> AircraftModels  get; set; 
        public DbSet<AircraftOwner> AircraftOwners  get; set; 
        public DbSet<AircraftOwnerType> AircraftOwnerTypes  get; set; 
        public DbSet<Country> Countries  get; set; 
        public DbSet<GPEncodingType> GPEncodingTypes  get; set; 
        public DbSet<LocationPoint> LocationPoints  get; set; 
        public DbSet<Manufacturer> Manufacturer  get; set; 
        public DbSet<Pilot> Pilots  get; set; 
        public DbSet<ServiceProvider> ServiceProviders  get; set; 
        public DbSet<State> States  get; set; 
        public DbSet<Trip> Trips  get; set; 
        public DbSet<Stop> Stops  get; set; 
        public DbSet<Track> Tracks  get; set; 


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        


            modelBuilder.Entity<AddressType>(
                e =>
                
                    e.Property(n => n.AddressTypeId).IsRequired().UseSqlServerIdentityColumn();
                    e.Property(n => n.Name).IsRequired().HasMaxLength(15);
                    e.Ignore(n => n.IsDirty);
                );

            modelBuilder.Entity<Address>(
                e =>
                
                    e.Property(n => n.AddressId).IsRequired().UseSqlServerIdentityColumn();
                    e.Property(n => n.AddressTypeId).IsRequired();
                    e.Property(i => i.CountryId).HasMaxLength(2);
                    e.Property(i => i.AddrLine1).HasMaxLength(256);
                    e.Property(i => i.AddrLine2).HasMaxLength(256);
                    e.Property(i => i.AddrLine3).HasMaxLength(256);
                    e.Property(i => i.Postcode).HasMaxLength(50);
                    e.Ignore(n => n.IsDirty);
                );
...

【问题讨论】:

我们能看到 IdentityUserLogin 的定义吗? 是系统类型...? 是的,但您一定是在某处使用过它或继承自它?您已发布IdentityUser,但未在您使用过IdentityUserLogin的地方发布 不知道this answer 有什么帮助吗? 尝试在覆盖中添加base.onModelCreating(modelBuilder),它应该是覆盖方法的第一条语句。看看有没有帮助? 【参考方案1】:

基本上Identity表的键映射在IdentityDbContextOnModelCreating方法中,如果不调用这个方法,你最终会得到你得到的错误。如果您从 IdentityDbContext 派生并提供您自己的 OnModelCreating 定义,则不会调用此方法,就像您在代码中所做的那样。使用此设置,您必须使用 base.OnModelCreating 语句显式调用 IdentityDbContextOnModelCreating 方法。 This answer 还讨论了我在此处发布的选项

【讨论】:

【参考方案2】:

我最近在 .NET 5 上工作,遇到了同样的问题。在我的例子中,我有派生自 IdentityUserIdentityRoleIdentityUserRoleApplicationUserApplicationRoleApplicationUserRole 的类。

ApplicationUserRole 有一个复杂的键,它是 UserId 和 RoleId 的组合,在 OnModelCreating 方法中定义相同。

在播种数据时,我在向用户添加角色时指的是IdentityUserRole 而不是ApplicationUserRole。这导致了同样的问题。在经历了一些麻烦之后,我意识到出了什么问题。我刚把它改成ApplicationUserRole

【讨论】:

【参考方案3】:

以防万一这可以帮助我遇到这个问题并且因为我已经覆盖 OnModelCreating 而发疯了。

事实证明,在覆盖 IIdentityUser 时,我使用了智能感知建议的错误命名空间。

我正在使用:

Microsoft.AspNet.Identity.EntityFramework

而且应该一直在使用

Microsoft.AspNetCore.Identity

【讨论】:

以上是关于实体类型“Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<string>”需要定义一个键的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 - 您能否将导入的存储过程的结果类型映射到自定义实体类型?

附加类型实体失败,因为相同类型的另一个实体已经具有相同的主键值。

具有非实体返回类型的实体模型中的函数导入

画像专题(2-3)根据实体类型和实体主键获取客户画像画像专题

核心数据:根据实体类型对抽象实体的结果进行排序

Hibernate 不包含与另一个实体列表中的实体相同类型的子实体