Как отобразить 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.1

Код: Выделить всё

public 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);
}
, который никогда не вызывается, с или без нового модификатора . ( используется только тогда, когда я добавил член ниже в базовый класс)

Код: Выделить всё

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


Подробнее здесь: https://stackoverflow.com/questions/797 ... int-called
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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