Как посеять роли в .NET Core 2.0? - PullRequest
0 голосов
/ 03 мая 2018

В данный момент я пытаюсь настроить роли с помощью RoleManager<Identity>, встроенного в .NET Core 2.0, mvc-framework.

Однако я получаю следующую ошибку:

System.ObjectDisposedException
HResult=0x80131622
Message=Cannot access a disposed object. A common cause of this error is 
disposing a context that was resolved from dependency injection and then 
later trying to use the same context instance elsewhere in your application. 
This may occur if you are calling Dispose() on the context, or wrapping the 
context in a using statement. If you are using dependency injection, you 
should let the dependency injection container take care of disposing context 
instances. The error occured in line 20 of UserRoleSeed-class.

Это из-за асинхронного символа метода Seed()?

Моя программа.cs:

public class Program
{
    public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        using (var scope = host.Services.CreateScope())
        {
            var serviceProvider = scope.ServiceProvider;
            try
            {
                var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

                new UserRoleSeed(roleManager).Seed();
            }
            catch
            {
                throw new Exception();
            }
        }

        host.Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

Мой UserRoleSeed.cs:

public class UserRoleSeed
{
    private readonly RoleManager<IdentityRole> _roleManager;

    public UserRoleSeed(RoleManager<IdentityRole> roleManager)
    {
        _roleManager = roleManager;
    }

    public async void Seed()
    {
        if ((await _roleManager.FindByNameAsync("Berijder")) == null)
        {
            await _roleManager.CreateAsync(new IdentityRole {Name = 
        "Berijder"});
        }
    }
}

Это должно создать новую запись в таблице dbo.AspNetRoles моего Context imo, но это не так. Проблема может быть чем-то небольшим, я впервые пытаюсь использовать роли в Mvc-фреймворке.

Сначала я попытался использовать файл Startup.cs, вызвав метод Seed() в методе Configure () этого файла, который не сработал (возможно, потому что это CORE 2.0, а не 1.0).

1 Ответ

0 голосов
/ 03 мая 2018

Асинхронная пустота функционирует как метод «забей и забудь». Код продолжит работу и удалит все объекты до завершения асинхронной проверки. Еще один способ справиться с этим:

Сделайте это асинхронным Task и позвоните Wait();

public async Task SeedAsync()
{
    ...
}

Назовите это так:

// Calling Wait in EFCore is not so much of a problem, since there is not
// really a main blocking thread like UI program's have in .NET framework.
new UserRoleSeed(roleManager).SeedAsync().Wait();

Другим решением является использование бегуна задач:

public static void Main(string[] args)
{
    var host = BuildWebHost(args);
    Task.Run(() => InitializeAsync(host));
    host.Run();
}

private static async Task InitializeAsync(IWebHost host)
{
    using (var scope = host.Services.CreateScope())
    {
        var serviceProvider = scope.ServiceProvider;
        try
        {
            var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

            await new UserRoleSeed(roleManager).SeedAsync();
        }
        catch
        {
            // TODO: log the exception
            throw;
        }
    }
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();
...