我有一个使用 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);
});
...
基本上,Identity 表的键是在
OnModelCreating
的 IdentityDbContext
方法中映射的,如果不调用此方法,您最终将收到所得到的错误。如果您从 IdentityDbContext
派生并提供您自己的 OnModelCreating
定义(如您在代码中所做的那样),则不会调用此方法。通过此设置,您必须使用 OnModelCreating
语句显式调用 IdentityDbContext
的 base.OnModelCreating
方法。
这个答案还讨论了我在这里发布的选项
我最近在开发 .NET 5,也遇到了同样的问题。就我而言,我从
ApplicationUser
、ApplicationRole
和 ApplicationUserRole
派生了 IdentityUser
、IdentityRole
和 IdentityUserRole
的派生类。
ApplicationUserRole
有一个复杂的键,它是 UserId 和 RoleId 的组合,并在 OnModelCreating 方法中定义相同。
在播种数据时,我在向用户添加角色时指的是
IdentityUserRole
而不是 ApplicationUserRole
。这导致了同样的问题。经过一番麻烦之后,我意识到出了什么问题。我刚刚将其更改为ApplicationUserRole
。
以防万一这对遇到此问题的任何人有所帮助,因为我已经重写了 OnModelCreating,所以我快要疯了。
事实证明,当重写 IIdentityUser 时,我使用了智能感知建议的错误名称空间。
我正在使用:
Microsoft.AspNet.Identity.EntityFramework
并且应该一直在使用
Microsoft.AspNetCore.Identity
在 dotnet core 7 中,我为所有型号上可用的主键添加了 [System.ComponentModel.DataAnnotations.Key]。问题解决了。
由于 Identity 表的键是在 IdentityDbContext 的 OnModelCreating 方法中映射的
所以解决方案是
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder);
// another code
}