Сбой Add-Migration при использовании UnityServiceProvider - PullRequest
0 голосов
/ 23 января 2019

У меня есть простое приложение .NET Core, которое структурировано так

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args)
            .Build()
            .Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseUnityServiceProvider()
            .UseStartup<Startup>();
}

// Startup.cs
public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    {
        this.Configuration = configuration;
        this.Environment = environment;
    }

    public IConfiguration Configuration { get; }

    public IHostingEnvironment Environment { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddControllersAsServices();

        // This conditional is only flipped for testing purposes
        // Migrations work perfectly fine for SqlLite
        if (!this.Environment.IsDevelopment())
        {
            services
                .AddDbContext<EstateContext>(opt => opt.UseSqlite(nameof(EstateContext)));
        }
        else
        {
            services
                .AddEntityFrameworkSqlServer()
                .AddDbContext<EstateContext>(opt => opt.UseSqlServer(
                    this.Configuration.GetConnectionString("DefaultConnection"),
                    sqlOptions => sqlOptions.MigrationsAssembly(
                        typeof(Property) // Where my .Data namespace lives
                            .Assembly
                            .FullName)));
        }
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        if (this.Environment.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseMvc();
    }

    public void ConfigureContainer(IUnityContainer container)
    {
        // This call currently does nothing
        UnityConfig.ConfigureContainer(container);
    }
}

Приложение работает правильно, но при попытке добавить-миграцию выдает ошибку

Служба для типа 'System.Collections.Generic.IEnumerable`1 [Microsoft.EntityFrameworkCore.DbContextOptions]' не зарегистрирована. "

Если я удалю строку .UseUnityServiceProvider(), миграция будет работать как положено. Если я использую SqlLite вместо SqlServer, я могу запустить миграцию с .UseUnityServiceProvider() (предположительно, потому что SqlLite не требует каких-либо DbContextOptions или связанных классов)

Для справки вот как выглядит EstateContext

public class EstateContext : DbContext
{
    public EstateContext(DbContextOptions options)
        : base(options)
    { }

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

    protected override void OnModelCreating(ModelBuilder builder)
    {
        // Ignore the Mongo properties in the SQL DB
        Assembly
            .GetAssembly(typeof(MongoEntity))
            .GetTypes()
            .Where(t =>
                t.IsClass &&
                !t.IsAbstract &&
                t.IsSubclassOf(typeof(MongoEntity)))
            .ToList()
            .ForEach(t =>
            {
                builder
                    .Entity(t)
                    .Ignore(nameof(MongoEntity.Id))
                    .Ignore(nameof(MongoEntity.Version));
            });
    }

    public DbSet<Property> Properties { get; set; }

    public DbSet<Tax> Taxes { get; set; }

    public DbSet<HomeOwnerAssociation> Associations { get; set; }
}
...