Добавление удостоверения ASP.NET (управление пользователями) в OData через веб-API 2

У меня есть проект OData, созданный на основе шаблона веб-API (включая учетные данные).

У меня есть класс ApplicationUser:IdentityUser.

У меня есть класс TournamentContext: IdentityDbContext.

У меня есть AccountController по умолчанию, который поставляется с шаблоном с атрибутом [RoutePrefix("api/Account")].

В WebApiConfig.cs для маршрутизации по умолчанию шаблона веб-API у меня есть

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional});

Для поддержки OData я добавил:

config.Routes.MapODataRoute("odata", "odata", GetModel(),
            new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

а также

private static IEdmModel GetModel()
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();            
        builder.EntitySet<Tournament>("Tournaments");
        return builder.GetEdmModel();
    }

Теперь я хочу предоставить доступ к управлению учетной записью/пользователем через API OData. Как мне этого добиться?

Спасибо, Янив Ратсон.


person janiv    schedule 04.02.2014    source источник
comment
Вы пытаетесь сделать это, сохраняя при этом путь API?   -  person Schandlich    schedule 05.02.2014
comment
Да, но я могу отказаться от него.   -  person janiv    schedule 06.02.2014


Ответы (1)


Вы можете создать ODataController для управления удостоверениями пользователей с помощью шаблонов:

1) щелкните правой кнопкой мыши папку «Контроллеры», «Добавить» -> «Контроллер...».

2) выберите «Контроллер OData Web API 2 с действиями, Entity Framework»

3) в диалоговом окне выберите сгенерированный класс модели для пользователей приложения - ApplicationUser (WebApplication1.Models) по умолчанию - и соответствующий контекст данных

4) после завершения генерации вы должны заменить объявление свойства DbSet автоматически добавленным в ваш контекст данных

    public System.Data.Entity.DbSet<WebApplication1.Models.ApplicationUser> ApplicationUsers { get; set; }

с объявлением метода

    public DbSet<ApplicationUser> GetApplicationUsers()
    {
        return (DbSet<ApplicationUser>) Users;
    }

(поскольку ваш контекст данных наследуется от IdentityDbContext, у которого есть свойство IDbSet Users). Значит ошибка

Несколько наборов объектов для каждого типа не поддерживаются. Наборы объектов ApplicationUsers и Users могут содержать экземпляры типа WebApplication1.Models.ApplicationUser.

если не делать замену.

5) последнее - вы должны заменить в сгенерированном коде контроллера "db.ApplicationUsers" на "db.GetApplicationUsers()".

person Ivan Samygin    schedule 26.09.2014