2015-11-30 14 views
9

Ho un'applicazione ASP.NET5 MVC che utilizza EF7. Funziona tutto bene finora e sono in grado di aggiungere migrazioni e mantenere i dati nel database. Ora, dopo l'aggiunta di identità al mio progetto strato di dati ottengo questo errore quando si tenta di aggiungere una nuova migrazione:Il tipo di entità "Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin <string>" richiede una chiave da definire

Il tipo di entità 'Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin' richiede una chiave da definire

mio contesto è derivato da IdentityDbContext:

public class ASSWebApiContext : IdentityDbContext<AppUser> 

classe 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; } 
    } 
} 

project.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" 
    } 
} 

Tutto quello che ho fatto qui è per caricare il nuovo pacchetto rilevante: "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-finale", aggiunta la classe AppUser - nient'altro. Ho avuto un progetto simile usando la beta-8 usando lo stesso identico schema in cui ha funzionato senza problemi. Ci sono cambiamenti rilevanti tra beta-8 e rc-1?

grazie!

Di seguito è riportata la parte di ASSWebApiContext. Esiste un modelBuilder.Entity per la maggior parte delle entità che dispongono di un DbSet. Quindi il file va avanti per un bel po '...

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); 
       }); 
... 
+0

Possiamo vedere la definizione di IdentityUserLogin? – Luke

+0

È un tipo di sistema ...? –

+0

Sì, ma devi averlo usato da qualche parte o ereditato da esso? Hai pubblicato 'IdentityUser', ma non dove hai usato' IdentityUserLogin' – Luke

risposta

21

Fondamentalmente le chiavi di tavole di identità sono mappati in OnModelCreating metodo IdentityDbContext e se questo metodo non viene chiamato, si finirà per ottenere l'errore che avete ottenuto . Questo metodo non viene chiamato se si deriva da IdentityDbContext e si fornisce la propria definizione di OnModelCreating come nel codice. Con questa configurazione è necessario chiamare esplicitamente il metodo OnModelCreating di IdentityDbContext utilizzando la dichiarazione base.OnModelCreating. This answer discute anche l'opzione che ho postato qui

Problemi correlati