Я пытаюсь выставить статические объекты, используя 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 (что глупо для меня, оно должно работать со старыми), но даже это не помогло.