Sto cercando di utilizzare EntityFramework Core per archiviare entità che condividono lo stesso modello ma che hanno origini diverse. Ho un enum ProductType
che designa il tipo di entità.
public enum ProductType
{
Digital,
Furniture,
Health,
}
public class ProductModel
{
public int Id {get; set;}
public ProductType Type {get;set;}
public decimal Price {get; set;}
public int Stock {get;set;}
}
Sto usando un DbContext
derivato per interagire con SqlServer Express:
public class ProductDbContext : DbContext
{
public ProductType ProductType { get; }
public DbSet<ProductModel> Products { get; }
public ProductDbContext( ProductType type )
{
ProductType = type;
}
protected override void OnModelCreating( ModelBuilder modelBuilder )
{
var productEntity = modelBuilder.Entity<ProductModel>()
.ToTable( $"Products-{ProductType}" );
}
}
Voglio che ogni ProductType
sia suddiviso nella propria tabella, in modo che i prodotti vengano archiviati in dbo.Products-Digital
, dbo.Products-Furniture
e dbo.Products-Health
.
L'implementazione di cui sopra funziona per un singolo ProductType
, ma inizio a riscontrare problemi quando provo a creare una tabella per più di uno. L'esecuzione del seguente (ovviamente) causa problemi, poiché creerà solo una tabella per il primo ProductType
riscontrato, poiché il database è già stato creato successivamente:
var types = Enum.GetValues( typeof(ProductType) ).Cast<ProductType>();
foreach( var type in types )
{
var context = new ProductDbContext( type );
context.Database.EnsureCreated();
}
Vorrei poter aggiungere nuovi valori ProductType
col passare del tempo e fare in modo che EFCore crei automaticamente tabelle per ognuno se non esistono già.
Quindi, come posso ottenere EF Core per garantire automaticamente l'esistenza di una tabella per ciascun ProductType
, inclusi quelli che aggiungerò in seguito?
Questo è un esempio del modello di ereditarietà delle tabelle per tipo che non è attualmente supportato da EF Core, è necessario passare al modello di gerarchia delle tabelle supportato e che può essere configurato tramite l'API Fluent.
https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance