Estoy usando el enfoque EF Core DbFirst. Mi dbContext se crea automáticamente mediante el comando Scaffold-DbContext.
Necesito agregar DbSets adicionales en un dbContext y agregar al método OnModelCreating de dbContext un código adicional, pero después de cada andamio, ese código agregado se borra y tengo que agregarlo cada vez más.
Lo que quiero hacer es crear otra clase parcial de dbContext y marcar anular anular OnModelCreating (ModelBuilder modelBuilder) como un método parcial
pero consigue errores:
Aquí hay un pseudo código:
MyDbContext1.cs - generado por Scaffold-DbContext
public partial class MyDbContext : DbContext
{
public MyDbContext()
{
}
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<Client> Clients { get; set; }
protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>(entity =>
{
// ... some code
}
}
}
MyDbContext2.cs: este código que agregué cada vez en dbContext después del andamiaje:
public partial class MyDbContext
{
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }
protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}
Una alternativa sería crear otra clase de contexto que se herede de MyDbContext que incluya todo el código personalizado. y luego usa esta nueva clase como tu contexto. De esta manera, no hay necesidad de actualizar el código generado.
public class MyDbContext2 : MyDbContext
{
public MyDbContext2()
{
}
public MyDbContext2(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}
Ahora puede implementar OnModelCreatingPartial
en una clase parcial como esta:
public partial class RRStoreContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder builder)
{
builder.Entity<RepeatOrderSummaryView>().HasNoKey();
}
}
Si observa el archivo de contexto generado, justo al final verá ...
OnModelCreatingPartial(modelBuilder);
Nota: Esto era necesario porque necesitaba agregar manualmente HasNoKey
para un procedimiento almacenado (con un tipo de retorno personalizado que de otro modo no estaba andamio).