Используйте набор данных JSON в качестве начального числа для базы данных EntityFramework - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь выставить статические объекты, используя Microsoft.EntityFrameworkCore в .netcoreapp 2.1.

Данные, которые я хочу предоставить, находятся в файле .json, и я могу десериализовать их без проблем в ихсоответствующие классы c #.

Вот пример структуры: https://pastebin.com/SKCKsDJi

Для ясности я предлагаю вам прочитать ее, используя любимый JSON Reader

А вот версия этих объектов на c #:

public class FoodItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public FoodType Type { get; set; }
    public string Picture { get; set; }
    public float Price { get; set; }
    public string Currency { get; set; }
    public IEnumerable<Ingredient> Ingredients { get; set; }
    public bool IsVegetarian { get; set; }
}

public class FoodType
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Ingredient
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Позвольте нам упростить это, хотя есть ingredients, types и items, элементы в основном сэндвичи, которыеопределенного типа и содержат список ингредиентов.Все 3 имеют идентификаторы, соответствующие им.Вот где моя проблема, или я так думаю.

Все работает нормально, если я просто использую "Типы", например, в моем dbcontext.Как только я пытаюсь добавить либо ингредиенты, либо предметы, либо все 3 (которые мне нужны, но только детские шаги), у меня появляется следующая ошибка:

InvalidOperationException: The instance of entity type 'Ingredient' cannot be tracked because another instance with the key value '{Id: 1}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.

Это происходит, когда:

    public EatupController(EatupContext context)
    {
        _context = context;
        var completeModel = JsonConvert.DeserializeObject<EatUpDataModel>(EatUpDataSet.Complete);

        _context.Types.AddRange(completeModel.Types);   //Works
        _context.Ingredients.AddRange(completeModel.Ingredients);   //Crashes here.
        //If removed, all is fine but data is incomplete


        //_context.Types.AddRange(completeModel.Types);  //Unused
        //_context.Items.AddRange(completeModel.Items);  //Unused

        _context.SaveChanges();
    }

Я не понимаю, почему он жалуется на дубликаты ID, потому что все они идентичны.За исключением случаев, когда я ссылаюсь на ингредиент X в элементе, очевидно, что некоторые элементы будут использовать ингредиенты, используемые другими элементами (многие сэндвичи имеют помидоры).Но, безусловно, этот тип отношений разрешен.

Сначала у меня были идентификаторы, начинающиеся с 0 для всех различных типов объектов, поэтому ингредиенты варьировались от 0 до 100, элементы от 0 до 60 и типы от 0 до7. Но так как у меня была эта ошибка, я отредактировал все идентификаторы, и у меня все еще есть ошибка, которая очень запутанная.

Из того, что я прочитал, это также может быть связано с использованием контекста в разных потоках, но этоне тот случай.Если я удаляю строку, которая дает сбой, она перестает падать, и я могу правильно видеть данные в контексте.В этом случае только типы.Если я добавляю только элементы или ингредиенты в контекст, по той же причине происходит сбой, просто в другом объекте (ингредиенте или элементе).

Куда мне идти отсюда?У меня даже нет плохого решения, которое я мог бы попытаться реализовать.Моя худшая идея состояла в том, чтобы вручную изменить Id (что глупо для меня, оно должно работать со старыми), но даже это не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...