gpt4 book ai didi

entity-framework - 如何将针对 DTO 的 OData 查询映射到 EF 实体?

转载 作者:行者123 更新时间:2023-12-04 08:08:41 24 4
gpt4 key购买 nike

我在允许 OData 查询的 Asp.Net Web Api 应用程序中有一个 ODataController。我只允许读取,不允许更新。我没有直接公开数据模型,而是创建了一组 DTO。 DTO 上的属性名称不一定与 EF 模型上的属性匹配。当我尝试对 EF 模型使用 OData 查询时,这会导致问题。我已经查看了有关此主题的 StackOverflow 上的其他帖子,但似乎都没有解决此问题。

这是我现在所拥有的:

public IQueryable<Customer> GetCustomer(ODataQueryOptions<Customer> query)
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Customer>("Customers");
builder.EntitySet<RECORD>("Records");
builder.Namespace = "MyDataService.Models";

var opts = new ODataQueryOptions<RECORD>(new ODataQueryContext(builder.GetEdmModel(), typeof(RECORD)), this.ActionContext.Request);
var records = (IQueryable<RECORD>)opts.ApplyTo(db.RECORDS);
return ConvertToCustomerList(records);
}

这一直有效,直到我在选择或过滤器中引用特定字段。一旦我在我的 OData 查询中引用了一个字段,我就会得到一个 ODataException 像 - Could not find a property named 'LastName' on type 'MyDataService.Models.RECORD .这是因为 EF 属性具有不同的命名约定。在这种情况下,它应该使用“LAST_NAME”。

似乎我需要解析查询,然后用正确的名称替换字段引用。我发现 ODataUriParser 似乎可以帮助解决这个问题,但它并不像我希望的那么干净。

任何人都可以为我提供一些解决此问题的指示吗?有没有更好的方法?

最佳答案

WebApi OData 新功能模型别名可能会解决您的问题。您不必在 Edm 模型和 aDTO 之间使用相同的名称。例如,有一个属性名称 OrderDto.Total,但在 Edm 模型中它变成了 Order.Check

        ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.ModelAliasingEnabled = true;

EntitySetConfiguration<CustomerDto> customers = builder.EntitySet<CustomerDto>("Customers");
EntitySetConfiguration<OrderDto> orders = builder.EntitySet<OrderDto>("Orders");
orders.EntityType.Name = "Order";
orders.EntityType.Property(p => p.Total).Name = "Check";
return builder.GetEdmModel();

请引用 https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ 中的 ODataModelAliasingSample

关于entity-framework - 如何将针对 DTO 的 OData 查询映射到 EF 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22969225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com