Sina-Soltani / Parbad

A free, open-source, integrated and extensible library which connects your web applications to online payment gateways. Gateways can be added or developed by you.
GNU Lesser General Public License v3.0
364 stars 81 forks source link

ParbadDataContext migration #291

Closed drspam1991 closed 2 years ago

drspam1991 commented 2 years ago

با سلام. من در .netCore دوتا sub project دارم به نام های Framework و Infrastructure. زیرپروژه Infrastructure به Framework وابسته هست. در کلاس StartUp که در Framework قرار داره، پرباد رو به این شکل Config کردم:

services.AddParbad()
    .ConfigureGateways(gateways =>
    {
        gateways
        .AddParbadVirtual()
        .WithOptions(options => options.GatewayPath = "/MyVirtualGateway");
    })
    .ConfigureHttpContext(builder => builder.UseDefaultAspNetCore())
    .ConfigureStorage(builder => 
    {
        builder.UseEfCore(options => 
        {
            options.ConfigureDbContext = db => db.UseNpgsql(DatabaseConfigurationExtensions.ConnectionString(dbEndpoint, dbName, dbUsername, dbPassword),
            sql =>{
                sql.MigrationsAssembly(migrationAssembly);
            });
        });
    });

متغیر migrationAssembly نام زیرپروژه Infrustructre هست. در زیرپروژه Infrustructre هم Migration ها و DbContext های پروژه خودم قرار دارن. وقتی در مسیر Infrastructure دستور

dotnet ef migrations add AddParbad -c ParbadDataContext رو میزنم این خطا رو میگیرم:

No DbContext named 'ParbadDataContext' was found.

به هر دو زیر پروژه کتابخانه های زیر اضافه شدن:

    <PackageReference Include="Parbad.AspNetCore" Version="1.2.0" />
    <PackageReference Include="Parbad.Storage.EntityFrameworkCore" Version="1.3.1" />
drspam1991 commented 2 years ago

با اضافه کردن IDesignTimeDbContextFactory مشکل حل شد:

 public class ParbadDataContextFactory : IDesignTimeDbContextFactory<ParbadDataContext>
    {
        public ParbadDataContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<ParbadDataContext>();
            optionsBuilder.UseNpgsql("...",  b => b.MigrationsAssembly("..."));

            var efCoreOptions = new OptionsWrapper<EntityFrameworkCoreOptions>(new EntityFrameworkCoreOptions());

            return new ParbadDataContext(optionsBuilder.Options, efCoreOptions);
        }
    } 
Sina-Soltani commented 2 years ago

درود موفق باشید