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);
});
...
ベストアンサー1
基本的に、Identity テーブルのキーは のOnModelCreating
メソッドにマップされておりIdentityDbContext
、このメソッドが呼び出されないと、取得したエラーが発生します。コードで行ったように から派生しIdentityDbContext
て独自の の定義を提供する場合、このメソッドは呼び出されません。この設定では、ステートメントを使用してのメソッドOnModelCreating
を明示的に呼び出す必要があります。OnModelCreating
IdentityDbContext
base.OnModelCreating
この答えここで私が投稿したオプションについても説明します