2016-05-23 16 views
8

Sto provando a utilizzare le migrazioni EF7 e si è bloccato quando ho modellato un modello Organizzazione con ereditarietà.Migrazioni EF7 - Il tipo CLR corrispondente per tipo di entità "" non è istantaneo

L'organizzazione è una classe astratta e vi sono due classi concrete che l'ereditano denominate Individuale e Azienda.

Ho impostato la classe astratta Organizzazione come DbSet in DbContext ed eseguito le migrazioni.

Sto seguendo questo tutorial viene mostrato here

il seguente errore:

La corrispondente tipo CLR per tipo di entità 'Organizzazione' non è creare istanze e non v'è nessun tipo di entità derivato nel modello che corrisponde a un tipo CLR concreto.

Che cosa devo fare?

EDIT - Aggiornato con il codice di

Organizzazione

public abstract class Organization 
{ 
    public Organization() 
    { 
     ChildOrganizations = new HashSet<Organization>(); 
    } 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public bool Enabled { get; set; } 
    public bool PaymentNode { get; set; } 
    public DateTime Created { get; set; } 
    public DateTime Updated { get; set; } 

    // virtual 
    public virtual ICollection<Organization> ChildOrganizations { get; set; } 

} 

individuale

public class Individual : Organization 
{ 
    public string SocialSecurityNumber { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
} 

società

public class Company : Organization 
{ 
    public string Name { get; set; } 
    public string OrganizationNumber { get; set; } 
} 

DbContext

public class CoreDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<Organization> Organization { get; set; } 

    public CoreDbContext(DbContextOptions<CoreDbContext> options) 
     : base(options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 
} 

Grazie in anticipo!

+0

Si prega di aggiungere il codice nella questione. –

+0

Avete DbContext nello stesso progetto o in un progetto separato? –

+0

@TomDroste DbContext si trova nello stesso progetto di libreria di classi dei modelli di dominio e le migrazioni si trovano nel progetto Web. – Rovdjuret

risposta

11

consultare: https://docs.microsoft.com/en-us/ef/core/modeling/inheritance

Se non si vuole esporre un DbSet per una o più entità nella gerarchia, è può utilizzare l'API Fluent per assicurarsi che siano inclusi nel modello.

Se non si desidera avere per creare un DbSet per ogni sottoclasse allora dovete definirli esplicitamente nella OnModelCreating override della DbContext:

public class CoreDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<Organization> Organization { get; set; } 

    public CoreDbContext(DbContextOptions<CoreDbContext> options) 
     : base(options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     builder.Entity<Individual>(); 
     builder.Entity<Company>(); 

     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 
} 
+0

Bello, ci proverò! – Rovdjuret

+0

Mi sono imbattuto in questo problema e la tua risposta ha risolto il mio problema. Dato che questo è il caso d'uso più logico (perché anche avere una classe base se si effettuano query solo per le sottoclassi?), Penso che questa risposta dovrebbe essere accettata. – blagae

+0

Il tuo link è rotto ora. –

0

Il problema potrebbe essere che si utilizza un progetto class library. In RC2 di EF Core non è possibile posizionare DBContext in un progetto di questo tipo. Questo è un problema noto. Quando lo converti in un progetto "app" dovrebbe funzionare di nuovo.

Maggiori informazioni & fonte:

Soluzione: https://docs.efproject.net/en/latest/cli/dotnet.html#dotnet-cli-issues

problema Github: https://github.com/aspnet/EntityFramework/issues/5460

+1

Questo non è il caso. Ho avuto questo problema in passato e l'ho risolto come scritto nei link che hai postato. Ho utilizzato correttamente le migrazioni, ma ora, quando utilizzo l'ereditarietà, genera l'errore che ho fornito in precedenza nella mia descrizione. Sembra che il problema sia con TPT (tabella per tipo) Vedi link: http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2- table-per-type-tpt – Rovdjuret

1

Simile al tutorial si è collegato, i tuoi DbSet<> proprietà dovrebbe essere il ereditando Individual e Company classi.

provare con il tuo CoreDbContext aspetto più simile a questo:

public class CoreDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<Individual> Individuals { get; set; } 

    public CoreDbContext(DbContextOptions<CoreDbContext> options) 
     : base(options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 
} 
+3

In EF6, in base a questo: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with -the-entity-framework-in-un-asp-net-mvc-application È possibile definire il DbSet utilizzando la classe base. Fare la stessa cosa in EF Core non sembra funzionare. – jcmcbeth