J'utilise l'approche EF Core DbFirst. Mon dbContext est créé automatiquement par la commande Scaffold-DbContext.
J'ai besoin d'ajouter des DbSets supplémentaires dans un dbContext et d'ajouter à la méthode OnModelCreating de dbContext un code supplémentaire, mais après chaque échafaudage ajouté, le code est effacé et je dois l'ajouter à chaque fois.
Ce que je veux faire est de créer une autre classe partielle dbContext et de marquer la protection protégée comme annulation OnModelCreating (ModelBuilder modelBuilder) en tant que méthode partielle
mais obtenez des erreurs:
Voici un pseudo code:
MyDbContext1.cs - généré par 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 - ce code que j'ai ajouté à chaque fois dans dbContext après le scaffolding:
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);
});
}
}
Une alternative serait de créer une autre classe de contexte héritant de MyDbContext qui inclut réellement tout le code personnalisé. puis utilisez cette nouvelle classe comme contexte. De cette façon, il n'est pas nécessaire de mettre à jour le code généré.
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);
});
}
}
Vous pouvez maintenant implémenter OnModelCreatingPartial
dans une classe partielle comme celle-ci:
public partial class RRStoreContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder builder)
{
builder.Entity<RepeatOrderSummaryView>().HasNoKey();
}
}
Si vous regardez le fichier de contexte généré - tout à la fin, vous verrez ...
OnModelCreatingPartial(modelBuilder);
Remarque: cela était nécessaire car j'avais besoin d'ajouter manuellement HasNoKey
pour une procédure stockée (avec un type de retour personnalisé qui n'était pas autrement échafaudé).