Sto usando EF Core e Identity. Ho creato una semplice app:
public class Program
{
static void Main(string[] args)
{
}
}
public class User : IdentityUser
{
}
public class Person : User
{
}
public class Document
{
public int Id { get; set; }
public User Owner { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<Person>
{
public DbSet<Person> Person { get; set; }
public DbSet<Document> Document { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=.\;Database=EFCoreDemo;Trusted_Connection=True;MultipleActiveResultSets=true");
}
}
Quando voglio aggiungere una migrazione mi ha dato questo errore:
Non è possibile configurare una chiave su "Persona" perché è un tipo derivato. La chiave deve essere configurata sul tipo di root "Utente". Se non hai intenzione di includere "Utente" nel modello, assicurati che non sia incluso in una proprietà DbSet nel tuo contesto, con riferimento a una chiamata di configurazione a ModelBuilder o referenziato da una proprietà di navigazione su un tipo che è incluso nel modello.
Ho testato queste modifiche:
1) Se il proprietario è diventato di tipo Persona, l'errore va, ma questa non è un'opzione per me perché in realtà l'utente e il documento sono in una libreria e la mia app finale utilizza quella libreria e la persona è nell'app.
2) Se ApplicationDbContext eredita da DbContext, l'errore va.
C'è qualche soluzione alternativa disponibile?
Per utilizzare Person
e IdentityDbContext
senza modificare il Document
, è possibile implementare un nuovo modello da Document
e modificarlo in Person
.
public class ApplicationDbContextTest : IdentityDbContext<Person>
{
public DbSet<MyDocument> Document { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreDemo;Trusted_Connection=True;MultipleActiveResultSets=true");
}
}
public class User : IdentityUser
{
}
public class Person : User
{
}
public class MyDocument:Document
{
public new Person Owner { get; set; }
}
public class Document
{
public int Id { get; set; }
public User Owner { get; set; }
}