Автоматическая настройка идентификаторов внешнего ключа для дочерних объектов в действиях покоя WebApi Rest, привязанных к EFCore - PullRequest
0 голосов
/ 07 декабря 2018

Я немного новичок в ядре Dotnet WebApi и Entity Framework, так что извините, если мне не хватает чего-то сверхъестественного.

У меня есть методы PUT веб-API для самостоятельного обновления модели, иликак дочерний элемент родителя - предоставив полную модель родителя с дочерним элементом.

Проблема, с которой я столкнулся, заключается в том, что я пометил идентификатор внешнего ключа как необходимый с помощью DataAnnotations [обязательно] плюс [Range], потому что без него PUT уровня ребенка будет бесполезен.Но я хотел бы принять его без указания родительского идентификатора, если он присоединен к родителю в JSON.

Например:

Для класса

public class ParentData
{ 
    public id id {get; set;}
    public string parentProperty {get; set;}
    public ChildData childData {get; set;}
}

public class ChildData
{
    public int childId {get; set;}
    [Required]
    public int parentId {get; set;}
    public string anotherAttribute{get; set;}
    [JsonIgnore]
    public ParentData parentData {get; set;}

}

Это можетвсе будет в порядке:

{
    "childId":123,
    "parentId":234,
    "anotherAttribute":"Bar"
}

Но это не удастся, потому что parentId отсутствует:

{
    "id":234,
    "parentProperty":"Foo",
    "childData": 
    {
       "childId":"123",
       "anotherAttribute":"Bar"
    }
}

Учитывая, что у меня есть беглая карта EF (entityTypeBuilder (). HasOne.WithOne (). HasForeignKey()) есть ли способ, которым я могу просто установить родительский идентификатор, автоматически позволяющий считать модель действительной?

Я думал, что мог бы сделать что-то внутри операции SET для объекта ChildData, которая, вероятно, предшествуетпроверка модели в конвейере, но это выглядит чрезмерно по сравнению с сопоставлением EF и аннотацией данных.

Обречен ли я задавать свойства вручную или создавать собственный валидатор и не использовать здесь аннотации данных?

1 Ответ

0 голосов
/ 07 декабря 2018

Опция 1

Возможно, вам следует разделить Модели API и EF.

В API вы можете удалить свойство Id для операций Create или сделать его необязательным.Также для операций обновления вы можете сделать это Required

Так что в вашем примере вам понадобится еще несколько моделей.

ParentData => реализует CreateParentData и Id требуется

CreateParentData => Идентификатор необязательный

ChildData => реализует CreateChildData, а идентификатор обязательный

CreateChildData => Идентификатор необязательный

Вы можетеиспользуйте AutoMapper для сопоставления с вашими объектами EF.

Опция 2

Возможно использование интерфейса IValidatableObject в ваших моделях.Вы можете ввести свой собственный валидатор.

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    var results = new List<ValidationResult>();

     // Do validation here, if there are errors add to the results

    return results;
}
...