Как удалить JSON и сохранить в базе данных с помощью Entity Framework

#c# #asp.net #asp.net-mvc #asp.net-core #asp.net-web-api

#c# #asp.net #asp.net-mvc #asp.net-ядро #asp.net-веб-api

Вопрос:

Я извлек некоторые данные JSON из API, и теперь я пытаюсь десериализовать их в объект и сохранить эти объекты в моей базе данных SQL Server, которая была создана с использованием Entity Framework. Следующий фрагмент кода не позволит мне добавить данные в Customers таблицу, потому что база данных не принимает список.

 string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<List<Root>>(apiResponse);

db.Customers.AddRange(data);
db.SaveChanges();
 

Также следующий код не будет работать. Я думаю, это может иметь какое-то отношение к использованию списка Customers , а не списка <Root> . Но я не хочу создавать Root таблицу в своей базе данных, я бы предпочел иметь только таблицу Customers без Root таблицы.

 List<Customers> customers = new List<Customers>();

string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<Customers>(apiResponse);
customers.Add(data);

db.Customers.AddRange(data);
db.SaveChanges();
 

Json

 [
  {
    "id": "1asda3",
    "name": "Customer1"
  },
  {
    "id": "asda2",
    "name": "Customer2"
  },
  {
    "id": "gfh234",
    "name": "Customer3"
  },
  {
    "id": "fdg312",
    "name": "Customer4"
  }
]
 

Модель:

 public class Root
{
    public List<Customers> Customers { get; set; }
}

public class Customers
{
    [JsonProperty("id")]
    public string id { get; set; }
    [JsonProperty("name")]
    public string name { get; set; }
}
 

DbContext:

 public DbSet<Customers> Customers { get; set; }
public DbSet<Root> Root { get; set; }
 

Редактировать

Я решил свою проблему, просто удалив корень общедоступного класса из моей модели. И с помощью:

 string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<List<Customers>>(apiResponse);

db.Customers.AddRange(data);
db.SaveChanges();
 

Комментарии:

1. db.Customers.AddRange(JsonConvert.DeserializeObject<List<Customers>>(apiResponse)); ?

2. Пожалуйста, вставьте полученное вами сообщение об исключении

3. Я думаю, вы имели в виду использовать клиентов вместо данных, db.Customers.AddRange(>>customers<<)

Ответ №1:

у вас есть объект json, содержащий массив json, поступающий из API, но вы анализируете его напрямую в массив json, я думаю, это может быть

 string apiResponse = await response.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<Root>(apiResponse);

db.Customers.AddRange(data.Customers);
db.SaveChanges();
 

Комментарии:

1. Когда я пытаюсь это решение, я получаю ошибку сериализации: Исключение JsonSerializationException: не удается десериализовать текущий массив JSON (например, [1,2,3] ) в тип ‘FrontlineAI.Models. Root’ потому что для правильного десериализации типа требуется объект JSON (например, {«name»:»value»} ). Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {«name»:»value»}), либо измените десериализованный тип на array или тип, который реализует интерфейс сбора (например, ICollection, IList), подобный List<T>, который может быть десериализован из массива JSON.