【发布时间】:2020-05-19 12:12:55
【问题描述】:
我正在尝试配置 ODATA 备用密钥,同时使用 ODATA V7、Aspnet Core 3.1 和端点路由。看来我在某处错过了配置步骤。
我认为我需要配置一个 AlternateKeysODataUriResolver,但是对于端点路由,我还没有找到我需要这样做的地方。
我的代码如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.Select().Filter().OrderBy().Count().MaxTop(20);
endpoints.MapODataRoute("api", "api", GetEdmModel());
endpoints.MapFallbackToPage("/_Host");
});
}
IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<DatabaseClaim>("DatabaseClaims");
odataBuilder.EntitySet<EmployeeClaim>("EmployeeClaims");
odataBuilder.EntitySet<Employee>("Employees");
odataBuilder.EntitySet<Department>("Departments");
var model = odataBuilder.GetEdmModel();
//Add alternate key: find entity type, find property, add alternate key def
IEdmEntityType employeeType = model.FindDeclaredEntitySet("Employees").EntityType();
var userid = employeeType.FindProperty("UserId");
((EdmModel)model).AddAlternateKeyAnnotation(employeeType, new Dictionary<string, IEdmProperty> {
{
"UserId", userid
}
});
return model;
}
然后在我的 odata 控制器中我有
[EnableQuery]
[ODataRoute("{id}")]
public async Task<IActionResult> Get(Guid id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
};
var record = await Context.Employees.FindAsync(id);
if (record == null)
{
return NotFound();
}
return Ok(record);
}
[EnableQuery]
[ODataRoute("Employees(UserId={userid})")]
public async Task<IActionResult> GetByUserId([FromODataUri] string userid)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
};
var record = await Context.Employees
.FirstOrDefaultAsync(r => r.UserId == userid);
if (record == null)
{
return NotFound();
}
return Ok(record);
}
【问题讨论】:
标签: asp.net-core odata