我正在尝试使用
Microsoft.EntityFrameworkCore
在一个
.netcoreapp 2.1
.
我要公开的数据位于中。json文件,我可以将其反序列化到相应的c#类中,而不会产生任何问题。
以下是结构示例:
https://pastebin.com/SKCKsDJi
为了清楚起见,我建议你用你的
favourite 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个都有与之匹配的id。我想这就是我的问题所在。
如果我只是在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);
_context.Ingredients.AddRange(completeModel.Ingredients);
_context.SaveChanges();
}
我不明白为什么它会抱怨重复的ID,因为它们都是一样的。除此之外,当我在一个项目中引用成分X时,显然有些项目会使用其他项目使用的成分(许多三明治有西红柿)。但这种关系肯定是允许的。
起初,对于所有不同类型的对象,我的id从0开始,所以成分从0到大约100,项目从0到60,类型从0到7。但由于我有这个错误,我编辑了所有的Id,我仍然有这个错误,这非常令人困惑。
据我所知,这可能也是由于在不同的线程中使用上下文造成的,但事实并非如此。如果我删除崩溃的行,它就会停止崩溃,并且我可以正确地看到上下文中的数据。在这种情况下,只有类型。如果我只在上下文中添加项目或成分,它会因为同样的原因崩溃,只会在另一个对象(成分或项目)中崩溃。
我应该从这里去哪里?我甚至没有可以尝试实施的糟糕解决方案。我最糟糕的想法是手动更改Id(这对我来说很愚蠢,它应该适用于旧的Id),但即使这样也失败了。