【问题标题】:Adding Microsoft Graph to existing Entity Framework Core将 Microsoft Graph 添加到现有的 Entity Framework Core
【发布时间】:2021-04-08 20:14:31
【问题描述】:

我在 .NET 5 上获得了一个使用 Entity Framework Core 制作的 API。

带有方法的查询 URL 类似于 GET https://api.mydomain.ch/v1/applicationusers

这将检索所有应用程序用户(这是有道理的)。

在 C# 中是这样的:

[HttpGet]
public async Task<ActionResult<ApplicationUser>> Get()
{
    return Ok(await _applicationUserRepository.GetAll());
}

现在使用我的 API 的客户端想要请求:GET https://api.mydomain.ch/v1/applicationusers?$filter=startswith(givenName,'Peter')

我已经看到这与 Microsoft Graph API 及其查询参数相匹配。我的客户也想为此使用其他实现 (https://docs.microsoft.com/en-us/graph/query-parameters)

我找不到任何适用于 Entity Framework Core 的实现示例。是否可以通过简单的方法实现这一点,而不是对数据库进行大的修改?

我需要完全自己实现这些功能吗?或者在这些查询参数函数和 Entity Framework Core 之间是否有微软的支持?

【问题讨论】:

  • 嗯,从 MS Graph 而不是从数据库获取用户信息将是一个根本 变化......基本上,您的数据库将不再用于全部,对于任何与用户相关的信息 - 所有信息都将来自 MS Graph(以及您拥有的任何用户数据存储 - 例如 Azure Active Directory)。 .....不确定这是否是实现这个的“简单方法”......
  • @marc_s 所以你认为(或者可能你知道)没有简单的方法(或任何方法)只使用图形查询参数并“解析”它们以将它们与 ef 核心数据库结合起来?
  • 好吧,如果您“只是”想要 MS Graph 提供的漂亮功能(例如能够排序和过滤) - 您可以随时查看如何制作自己的服务(api.mydomain.ch)支持 OData 协议——这就是使这些事情成为可能的“魔力”。
  • @marc_s 啊,这听起来像是个主意...有点努力,但可能仍然比以旧方式实现这些查询参数节省更多时间:)

标签: c# entity-framework-core .net-5 query-parameters microsoft-graph-sdks


【解决方案1】:

好的,答案很简单,需要实现的不是 Microsoft Graph,而是 OData

对于 .NET 5,没有很好的文档记录,因为此 .NET 版本的 NuGet 仍处于 RC 状态(预发布)。

要实现 OData,我们需要在 nuget 包中添加Microsoft.AspNetCore.OData我的答案是用8.0.0-rc 的状态写的。对于 v7.x,调用看起来有点不同,但有更好的文档记录。

我们需要做的是:

StartUp.ConfigureServices中添加OData:

ODataConventionModelBuilder builder = new(new DefaultAssemblyResolver());
builder.EntitySet<ApplicationUser>("ApplicationUser");
IEdmModel model =  builder.GetEdmModel();

services.AddOData(opt =>
{
    opt
        .AddModel("api/v1", model)
        .Select()
        .Expand()
        .OrderBy()
        .Filter()
        .Count();
});

使用.Select().Expand().OrderBy().Filter().Count(),您可以为 $select、$expand、...添加 api-query-parameters

我在Configure() 中的UseEndpoints 呼叫看起来是这样的:

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

确保控制器继承自ODataApiController。 一个动作如下所示:

[HttpGet]
[EnableQuery]
public async Task<ActionResult<ApplicationUser>> Get()
{
    return Ok(await _applicationUserRepository.GetAll());
}

这不会执行预期的查询。我们需要返回IQueryable&lt;T&gt; 来完成这项工作,所以我们不会查询所有记录:

[HttpGet]
[EnableQuery]
public IQueryable<ApplicationUser> Get()
{
    return _applicationUserRepository.GetAll();
}

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 2017-09-29
    • 1970-01-01
    • 2017-02-06
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多