У нас есть основной веб -API ASP.NET, который работает на .NET CORE 3.1, который необходимо обновить до .NET 8.0. Правильно карта.
Единственное различие, которое я вижу, - это конечная точка с «неправильным» отображением в .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());
});
.net 8.0 Startup
Вот то, что я считаю операторами ключа для настройки 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());
В версии .net Core 3.1public class InpatientController : BaseController
{
public override IActionResult Get()
{
// .
}
}
inpatientController наследует от BaseController , элементы ключей, показанные здесь:
[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);
}
}
В .net Core 3.1, он не вызывает get с помощью ключа, он вызывает get с аргументами. Однако в версии .net 8.0 get ([fromOdatauri] int) требуется для того же URI. В этот момент я получаю эту ошибку: < /p>
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);
}
И хотя эта перегрузка в базовом контроллере будет вызвана, а затем получаю следующую ошибку, где не может быть найдена в стационаре SQLEXCEPTE. Непосредственное окно действительно дает правильный FQN для сущности. < /p>
Я в растерянности. Что мне не хватает, пожалуйста? Также используется эта страница для справки: https://dev.to/renukapatil/odata-with-n ... tices-1iea
образное значение Дальнейшие исследования #1
Дальнейшие исследования вокруг композитных коэффициентов, добавляя композитные клавиши, не влияют на другие цели. Другие сущности с композитными клавишами (один имеет четыре клавиши!) Вернится штраф с правильной отображенной конечной точкой. Поместите его обратно, и мы нажимаем не ту конечную точку. Если оно в PAT -картировании не удается для одной из объектов. Там нет никакого имени Столкновение сущностей, моделей EDM. Самое близкое, что у нас есть пациент и стационар
services.AddControllers()
//.AddOData(
// options => options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(null).AddRouteComponents(
// someODataBuilder.GetEdmModel()))
.AddOData(
options => options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(null).AddRouteComponents(
"apps/pat",
patODataBuilder.GetEdmModel()))
.AddOData(
options => options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(null).AddRouteComponents(
"other/something",
anotherODataBuilder.GetEdmModel()))
;
Подробнее здесь: https://stackoverflow.com/questions/797 ... int-called
Как отобразить Odata, чтобы исправить конечную точку в .net 8.0 Odata - Неправильная конечная точка вызвана ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как правильно подготовить объект JSON для отправки в конечную конечную точку? [закрыто]
Anonymous » » в форуме Php - 0 Ответы
- 64 Просмотры
-
Последнее сообщение Anonymous
-