Массив строк JSON в Entity Framework - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь получить файл JSON в базу данных SQL Server с ключами автоматической идентификации и корректным отношением внешнего ключа.Все работает великолепно, за исключением массива строк.Данные выглядят более или менее так:

{
  "id" : "123",
  "name" : "Some Stuff",
  "phrase" : "More Stuff",
  "type" : "ABC",
  "label" : "Some label",
  "responseType" : "The Response Type",
  "answers" : [ "9" ]
}

Часть «ответы» вызывает у меня приступы.Похоже, это почти исключительно одно значение, но потенциально оно может иметь несколько значений, таких как

"answers" : [ "6", "7", "8" ]

Теперь я знаю, что List не поддерживается в EF для нативных типов, таких как string или int.В конечном счете, я бы предпочел иметь отдельную таблицу для списка значений ответов, которую я называю DataAnswers.

        public partial class Response
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ResponseId { get; set; }

        [JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
        public string Id { get; set; }

        [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
        public string Name { get; set; }

        [JsonProperty("phrase", NullValueHandling = NullValueHandling.Ignore)]
        public string Phrase { get; set; }

        [JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
        public string Type { get; set; }

        [JsonProperty("label", NullValueHandling = NullValueHandling.Ignore)]
        public string Label { get; set; }

        [JsonProperty("responseType", NullValueHandling = NullValueHandling.Ignore)]
        public string ResponseType { get; set; }

        [JsonProperty("answers", NullValueHandling = NullValueHandling.Ignore)]
        public virtual List<DataAnswer> DataAnswers { get; set; }
    }

    public partial class DataAnswer
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int DataAnswerId { get; set; }
        public string AnswerText { get; set; }
    }

В настоящее время я получаю сообщение об ошибке.

Newtonsoft.Json.JsonSerializationException: «Ошибка преобразования значения« 9 »в тип« ForeseeDemo.Data.DataAnswer ».Path 'items [0] .responses [0] .answers [0]', строка 60, позиция 23. '

Любые отличные идеи о том, как получить список строк ответов в таблицу свнешний ключ к ответу?

Заранее спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете создать объект передачи данных, а затем обработать преобразование b / t и объект сущности.

Вы можете создать пользовательский преобразователь JSON для обработки преобразования свойства.

Вы можете создать дополнительное свойство, которое используется для сериализации / десериализации, но не EF, и обрабатывать преобразования там:

[JsonIgnore]
public virtual List<DataAnswer> DataAnswers { get; set; }
[NotMapped]
[JsonProperty( "answers", NullValueHandling = NullValueHandling.Ignore )]
public List<string> DataAnswerStrings
{
    get => DataAnswers?.Select( da => da.AnswerText )?.ToList();
    set => DataAnswers = value
        ?.Select( s => new DataAnswer() { AnswerText = s } )
        ?.ToList() 
        ?? new List<DataAnswer>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...