Ho un modello base:
public abstract class Status
{
public string updateUserName { get; set; }
}
Quindi un modello che estende il modello base definito sopra:
public class Item : Status
{
public int Id { get; set; }
public string Description { get; set; }
}
Quindi ho definito le classi di configurazione per ciascuna:
public class ItemConfiguration : IEntityTypeConfiguration<Item>
{
public void Configure(EntityTypeBuilder<Item> builder)
{
builder.ToTable("Item", "dbo").HasKey(c => c.Id);
builder.Property(c => c.Description).IsRequired().HasMaxLength(100);
}
}
public class StatusConfiguration : IEntityTypeConfiguration<Status>
{
public void Configure(EntityTypeBuilder<Status> builder)
{
builder.Property(c => c.updateUserName).IsRequired().HasMaxLength(50);
}
Ora, ho la seguente classe Context:
public class TestDbContext : DbContext
{
public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
{
}
public DbSet<Item> Item { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new ItemConfiguration());
}
}
Sto cercando di capire come applicare le configurazioni del modello Status definite nella classe StatusConfiguration a tutti i modelli che si estendono ad esso (solo una in questo esempio: Item). Vorrei evitare di definire la stessa configurazione del modello di stato ogni volta che viene utilizzata. Il modello Status sarà essenzialmente meta dati associati a ciascun record Item (cioè una tabella Item nel database contenente tutte le proprietà definite in entrambi i modelli, niente di più e niente di meno).
Ad esempio, la mia implementazione corrente è la seguente classe ItemConfiguration senza utilizzare la classe StatusConfiguration:
public class ItemConfiguration : IEntityTypeConfiguration<Item>
{
public void Configure(EntityTypeBuilder<Item> builder)
{
builder.ToTable("Item", "dbo").HasKey(c => c.Id);
builder.Property(c => c.Description).IsRequired().HasMaxLength(100);
builder.Property(c => c.updateUserName).IsRequired().HasMaxLength(50);
}
}
Quella attuale implementazione funziona correttamente e migra nel database come previsto. Sto semplicemente cercando un modo più gestibile per andare avanti.
La mia ipotesi è che potrei estendere la classe ItemConfiguration per includere la classe StatusConfiguration ma non riesco a trovare un esempio di tale metodo online. Spero che qualcuno con un po 'più di esperienza possa gentilmente indicarmi la giusta direzione?
Fammi sapere se ulteriori informazioni sarebbero utili.
Se ho capito bene, lo Status
è solo una classe base e non un'entità di base che partecipa all'Ereditarietà del Database .
In tal caso è importante non fare mai riferimento alla classe Status
direttamente all'interno del modello e della configurazione dell'entità, ovvero senza DbSet<Status>
, nessuna proprietà di navigazione di tipo Status
o ICollection<Status>
, nessuna modelBuilder.Entity<Status>()
e nessuna IEntityTypeConfiguration<Status>
.
Invece, devi sempre fare riferimento ai tipi concreti che ereditano dallo Status
. Per riutilizzare il codice di configurazione, è necessario utilizzare metodi o classi generici vincolati e passare i tipi di entità concreta.
Dato che stai usando IEntityTypeConfiguration
classi IEntityTypeConfiguration
, probabilmente la cosa più naturale è rendere generica la tua classe StatusConfiguration
:
public class StatusConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : Status
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.Property(c => c.updateUserName).IsRequired().HasMaxLength(50);
}
}
e lascia che derivino le classi di configurazione delle entità derivate:
public class ItemConfiguration : StatusConfiguration<Item>
{
public override void Configure(EntityTypeBuilder<Item> builder)
{
base.Configure(builder); // <--
builder.ToTable("Item", "dbo").HasKey(c => c.Id);
builder.Property(c => c.Description).IsRequired().HasMaxLength(100);
}
}