C#: наследование от DbContext в Net Core, Конструктор: для этого DbContext не настроен поставщик базы данных. - PullRequest
0 голосов
/ 01 мая 2020

У меня есть PropertyApplication DbContext, как показано ниже,

public partial class PropertyContext : DbContext
{
    public PropertyContext()
    {
    }

    public PropertyContext(DbContextOptions<PropertyContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Address> Address { get; set; }
    public virtual DbSet<BoundaryChangeEvent> BoundaryChangeEvent { get; set; }

Я бы хотел наследовать от этого PropertyDbContext. Правильно ли это делается в конструкторе? Попытка выполнить модульное тестирование ниже, она переопределяет сохраненные изменения, чтобы внести в аудит информацию пользователя. Просто любопытно, выглядят ли приведенные ниже операторы конструктора правильно? Или мне следует попробовать опцию 2 ниже с опциями AuditablePropertyContext?

public class AuditablePropertyContext : PropertyContext
{
    private int _user;

    public AuditablePropertyContext()
    {
    }

    public AuditablePropertyContext(DbContextOptions<PropertyContext> options, UserResolverService userService)
        : base(options)
    {
        _user = userService.GetUser();
    }

    public void ApplyCreatedBy()
    {
        var modifiedEntities = ChangeTracker.Entries<ICreatedByUserId>().Where(e => e.State == EntityState.Added);
        foreach (var entity in modifiedEntities)
        {
            entity.Property("CreatedByUserId").CurrentValue = _user;
        }
    }

    public override int SaveChanges()
    {
        ApplyCreatedBy();
        return base.SaveChanges();
    }

}

Опция 2:

Я получаю сообщение об ошибке, пытаясь выполнить это,

public AuditablePropertyContext(DbContextOptions<AuditablePropertyContext> options, UserResolverService userService)
    : base(options)
{
    _user = userService.GetUser();
}

Ошибка:

Ошибка CS1503 Аргумент 1: не удается преобразовать из 'Microsoft.EntityFrameworkCore.DbContextOptions IPTS.PropertyManagement.Infrastructure.Auditable.Data.AuditablePropertyContext' в 'Microsoft.EntityFbtextOxtE .PropertyManagement.Infrastructure.Data.PropertyContext '

* Иногда компания использует SQL Сервер, иногда InMemory или SQLite

Сбой модульного теста:

services.AddSingleton(a =>
{
    var mock = new Mock<IUserResolverService>();
    mock.Setup(b => b.GetUser()).Returns(5);
    return mock.Object;
});

services.AddDbContext<PropertyContext>(
    options => options.UseInMemoryDatabase("Ipts").UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),
    ServiceLifetime.Singleton);
services.AddSingleton<DbContext, PropertyContext>();


services.AddDbContext<AuditablePropertyContext>(
    options => options.UseInMemoryDatabase("Ipts").UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),
    ServiceLifetime.Singleton);
services.AddSingleton<AuditablePropertyContext>();

services.RegisterMappingProfiles(new ApplicationServicesMappingProfile(),
    new PropertyManagementDataMappingProfile());
return services;

}

Модульный тест: ошибка

Message: 
System.InvalidOperationException : No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
Stack Trace: 
DbContextServices.Initialize(IServiceProvider scopedProvider, IDbContextOptions contextOptions, DbContext context)
DbContext.get_InternalServiceProvider()
DbContext.get_DbContextDependencies()

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Измените класс конструктора PropertyContext на следующий код:

public PropertyContext(DbContextOptions options)
        : base(options)
    {
    }

, затем измените класс конструктора AuditablePropertyContext на следующий код:

  public AuditablePropertyContext(DbContextOptions options, UserResolverService userService)
        : base(options)
    {
        _user = userService.GetUser();
    }

примечание: Удалите конструктор по умолчанию в обоих классах, когда он вам не нужен.

0 голосов
/ 01 мая 2020

Вы также можете предоставить специализированный DbContextOptions<Repo> только для конкретного подтипа.

например

public abstract class BaseRepo: DbContext
{
    public BaseRepo(DbContextOptions options) : base(options)
    {

    }
}


public sealed class Repo : BaseRepo
{
    public Repo(DbContextOptions<Repo> options) : base(options)
    {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...