Отправка нового объекта в конечную точку OData Web.API без идентификатора - PullRequest
0 голосов
/ 05 июня 2018

Я создаю API для проверки концепции, используя ASP.NET Core 2.1, Web.API и OData (7.0.0-beta4).

Одна из моих конечных точек OData отвечает за базовыеОперации CRUD для объекта Employer.Конечная точка POST - которая создает новую Employer запись - определяется следующим образом:

// POST: api/Employers
[HttpPost]
public async Task<IActionResult> PostEmployer([FromBody] Employer employer)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    _context.Employers.Add(employer);
    await _context.SaveChangesAsync();

    return CreatedAtAction("GetEmployer", new { id = employer.Id }, employer);
}

Моя Employer сущность определяется следующим образом:

namespace MyProject.Models
{
    public class Employer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsActive { get; set; }
    }
}

ЕслиЯ попал в эту конечную точку OData с телом POST следующим образом:

{
    "Name": "My Employer",
    "IsActive": true
}

Я получаю сообщение об ошибке:

InvalidOperationException: No route matches the supplied values.

Это потому, что свойство Id является обязательным, ноне предусмотрено в моем JSON.Однако я не хочу предоставлять свойство Id, потому что это свойство будет автоматически сгенерировано базой данных.Если я do предоставляю свойство Id, мой запрос будет успешно перенаправлен, но позже в процессе будет получена ошибка Entity Framework (Cannot insert explicit value for identity column), что имеет смысл.

Какя могу заставить мою конечную точку OData игнорировать обязательное свойство Id во время запроса POST?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Разобрался - оказывается, проблема не имеет ничего общего со свойством Id в моем классе сущностей.Вместо этого проблема заключалась в следующей строке:

return CreatedAtAction("GetEmployer", new { id = employer.Id }, employer);

Платформа должна выполнить некоторую проверку указанного действия («GetEmployer»), и она выдавала ошибку, что это действие недопустимо.

Я не уверен, как исправить это строковое значение, но я могу полностью избежать этой проблемы, используя более простое возвращаемое значение:

return Ok(new { Id = employer.Id });
0 голосов
/ 05 июня 2018

Попробуйте добавить атрибуты [DataContract] и [DataMember] к вашей модели Employer:

[DataContract]
public class Employer
{
    [DataMember(Name = "Id", IsRequired=false, EmitDefaultValue=false)]
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }
}

Дополнительная информация о свойствах DataMemberAttribute: https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute_properties(v=vs.110).aspx

...