Как отобразить Odata, чтобы исправить конечную точку в .net 8.0 Odata - Неправильная конечная точка вызванаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как отобразить Odata, чтобы исправить конечную точку в .net 8.0 Odata - Неправильная конечная точка вызвана

Сообщение Anonymous »

У нас есть основной веб -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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»