Я создаю службу OData v4, и мне нужна помощь в моей модели, и что можно сделать, а что нельзя сделать с OData.Я также использую .NET Core 2.2, Entity Framework Core и ASP.NET Core.Это мое первое приложение с .NET Core.
У меня на данный момент есть этот POST-запрос
[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey, [FromBody] Booking booking)
{
// ...
}
И мой POCO (EF-сущность)
public class Booking
{
[Key]
public Guid Id { get; set; }
[Required]
public Event Event { get; set; }
[Required]
public User Student { get; set; }
[Required]
public int Position { get; set; } // Position in the registration queue
[Required]
public DateTime ReservationTime { get; set; }
public DateTime? CancelTime { get; set; } // null by default
}
В этом POCO бронирование только CancelTime не требуется.Во время PostBooking () система настроит все необходимые свойства:
POST https://www.example.com/odata/Events(84a5c788-4f57-4983-b074-4a03a401484a)/Bookings
BODY
{
// In fact my body is empty because Position and ReservationTime I given by system. (now)
// Id is simply a new guid
// Event is in my oData link (84a5c788-4f57-4983-b074-4a03a401484a). I need to check it can be found
// Position is the number of booking register for this event + 1.
// UserId will be in my header (in a session token I will implement later with all security)
}
Я вижу 3 решения
1) Использование OData Action?2) Мне не нужно бронировать объект из тела в JSON.Можно ли написать метод POST следующим образом:
[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey)
{
// ...
}
3) Или вот так
[HttpPost]
[ODataRoute("Events({eventKey})/Bookings")]
public async Task<IActionResult> PostBooking([FromODataUri] Guid eventKey, [FromBody] BookingPostActionDto booking)
{
// ...
}
где
public class BookingPostActionDto() // Is a data tranfert object that I use only for API, not save in database
{
[Required]
public Guid RegistrationUserId { get; set; }
}
В соответствии со стандартом ODataрабочие решения здесь?Я спрашиваю не о лучшем, а о действительном в соответствии со стандартом.Например, я даже не знаю, позволяет ли OData мне работать с системой Dto, как в моем решении 3. Мое решение 2 работает, если я никогда не проверяю свое состояние модели, поскольку я проверяю свое состояние модели, оно пропустит все необходимые данные.Могу ли я создать действие, как в моем решении 1, когда я могу сделать POST, и POST кажется более подходящим?