Единственное различие, которое я вижу, - это конечная точка с «неправильным» отображением в .net 8.0 использует объект с составным первичным ключом. Свойства:
Code of Entities.inpatient :
Код: Выделить всё
public class Inpatient
{
[Key]
public string PatientNumber { get; set; }
[Key]
public DateTime AdmissionDateTime { get; set; }
public string OtherProperty { get; set; }
public string AnotherProperty { get; set; }
}
< /code>
Мы не владеем данными, поэтому не можем изменить структуру данных, чтобы использовать единый первичный ключ. < /p>
Из того, что я могу догадаться 3.1 Startup
Ниже я считаю, что ключевые операторы для настройки ODATA в исходном .NET Core 3.1 Startup.cs
Код: Выделить всё
.
.
services.AddControllers(options =>
{
options.Filters.Add(new AuthorizeFilter(authorisationPolicy));
});
.
.
services.AddOData();
.
.
.
var patODataBuilder = new ODataConventionModelBuilder(app.ApplicationServices);
patODataBuilder.EntitySet(nameof(Entities.Inpatient));
.
.
app.UseRouting();
.
.
app.UseEndpoints(endpoints =>
{
endpoints.Count().Filter().OrderBy().Expand().Select().MaxTop(Constants.MAX_PAGE_SIZE);
endpoints.MapODataRoute("Apps", "apps/pat", patODataBuilder.GetEdmModel());
});
Вот то, что я считаю операторами ключа для настройки ODATA в .net 8.0 startup.cs :
Код: Выделить всё
.
.
var patODataBuilder = new ODataConventionModelBuilder();
patODataBuilder.EntitySet(nameof(Entities.Inpatient));
.
.
services.AddControllers(options =>
{
options.Filters.Add(new AuthorizeFilter(authorisationPolicy));
})
.AddOData(opt => opt.AddRouteComponents("apps/pat", patODataBuilder.GetEdmModel())
.Select()
.Filter()
.OrderBy()
.Expand()
.SetMaxTop(Constants.MAX_PAGE_SIZE));
.
.
app.UseEndpoints(endpoints => endpoints.MapControllers());
Код: Выделить всё
public class InpatientController : BaseController
{
public override IActionResult Get()
{
// .
}
}
Код: Выделить всё
[EnableQuery(PageSize = Constants.MAX_PAGE_SIZE)]
public class BaseController : Controller where TEntity : class
{
public virtual IActionResult Get()
{
return Ok(_context.Set().AsQueryable());
}
public IActionResult Get([FromODataUri]int key)
{
var result = _context.Set().Find(key);
if (result == null)
return BadRequest("No result found.");
return Ok(result);
}
}
system.argumentexception: 'intity type' inpatient 'определяется с помощью составного ключа с двумя частями, но 1 значения были переданы в «Найти» метод < /p>
< /blockquote>
I-Im Im Im Im Im Im Im Im Im's IN INBILTITITY IN. картирование. Значение int равно 0 , которое следует ожидать, так как это значение по умолчанию INT, хотя я не предоставил ключ в URI, либо строку запроса. В версии .NET 8.0 в качестве версии .NET CORE 3.1, но DOCS MS .NET ODATA подвел меня в соответствии с этим до сих пор.
Код: Выделить всё
InpatientController
Код: Выделить всё
public new IActionResult Get([FromODataUri] string patientNumber, DateTime admissionDateTime)
{
var result = _context.Set().Find(patientNumber, admissionDateTime);
if (result == null)
return BadRequest("No result found.");
return Ok(result);
}
Код: Выделить всё
new
Код: Выделить всё
BaseController
Код: Выделить всё
public IActionResult Get([FromODataUri] string patientNumber, DateTime admissionDateTime)
{
if (string.IsNullOrEmpty(patientNumber) || admissionDateTime == default)
return Ok(_context.Set().AsQueryable());
var result = _context.Set().Find(patientNumber, admissionDateTime);
if (result == null)
return BadRequest("No result found.");
return Ok(result);
}
Я в растерянности. Что мне не хватает, пожалуйста? Также используется эта страница для справки: https://dev.to/renukapatil/odata-with-n ... tices-1iea
Подробнее здесь: https://stackoverflow.com/questions/797 ... int-called