Как расширить DbContext с частичным классом и частичным методом OnModelCreating в EntityFramework Core - PullRequest
0 голосов
/ 05 сентября 2018

Я использую подход EF Core DbFirst. Мой dbContext создается автоматически командой Scaffold-DbContext.

Мне нужно добавить дополнительные DbSets в dbContext и добавить в метод OnModelCreating dbContext некоторый дополнительный код, но после каждого леса этот добавленный код стирается, и мне приходится добавлять его каждый раз снова.

Я хочу создать еще один частичный класс dbContext и пометить защищенное переопределение void OnModelCreating (ModelBuilder modelBuilder) как частичный метод

но получите ошибки:

  1. Частичный метод не может иметь модификаторы доступа или виртуальные, абстрактные, переопределенные, новые, запечатанные или внешние модификаторы .
  2. Частичный метод не может иметь несколько реализующих объявлений

Вот псевдокод:

MyDbContext1.cs - генерируется 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 - этот код, который я каждый раз добавлял в dbContext после скаффолдинга:

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);
            });
        }
    }

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Альтернативой может быть создание другого класса контекста, который наследуется от MyDbContext, который фактически включает весь пользовательский код. а затем использовать этот новый класс в качестве контекста. Таким образом, нет необходимости обновлять сгенерированный код.

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);
        });
    }
}
0 голосов
/ 05 сентября 2018

Вы не можете переопределить методы в частичном классе, потому что все «части» становятся единым классом. Но вы можете сделать это, вызвав основной OnModelCreating вызовом частичного метода . Как это:

public partial class Db : DbContext
{
    partial void OnModelCreating2(ModelBuilder modelBuilder)
    {
       //additional config
    }
}

public partial class Db : DbContext
{

    public DbSet<Person> Persons { get; set; }

    partial void OnModelCreating2(ModelBuilder modelBuilder);
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        OnModelCreating2(modelBuilder);
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=localhost;database=efcore2test;integrated security=true");
        base.OnConfiguring(optionsBuilder);
    }
}
...