实体类型“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表的键映射在IdentityDbContext
的OnModelCreating
方法中,如果不调用这个方法,你最终会得到你得到的错误。如果您从 IdentityDbContext
派生并提供您自己的 OnModelCreating
定义,则不会调用此方法,就像您在代码中所做的那样。使用此设置,您必须使用 base.OnModelCreating
语句显式调用 IdentityDbContext
的 OnModelCreating
方法。
This answer 还讨论了我在此处发布的选项
【讨论】:
【参考方案2】:我最近在 .NET 5 上工作,遇到了同样的问题。在我的例子中,我有派生自 IdentityUser
、IdentityRole
和 IdentityUserRole
的 ApplicationUser
、ApplicationRole
和 ApplicationUserRole
的类。
ApplicationUserRole
有一个复杂的键,它是 UserId 和 RoleId 的组合,在 OnModelCreating 方法中定义相同。
在播种数据时,我在向用户添加角色时指的是IdentityUserRole
而不是ApplicationUserRole
。这导致了同样的问题。在经历了一些麻烦之后,我意识到出了什么问题。我刚把它改成ApplicationUserRole
。
【讨论】:
【参考方案3】:以防万一这可以帮助我遇到这个问题并且因为我已经覆盖 OnModelCreating 而发疯了。
事实证明,在覆盖 IIdentityUser 时,我使用了智能感知建议的错误命名空间。
我正在使用:
Microsoft.AspNet.Identity.EntityFramework
而且应该一直在使用
Microsoft.AspNetCore.Identity
【讨论】:
以上是关于实体类型“Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<string>”需要定义一个键的主要内容,如果未能解决你的问题,请参考以下文章
实体框架 - 您能否将导入的存储过程的结果类型映射到自定义实体类型?
附加类型实体失败,因为相同类型的另一个实体已经具有相同的主键值。