我正在尝试在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); //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时,显然某些项将使用其他项所使用的成分(许多三明治有西红柿)。但是可以肯定的是,这种关系是允许的。
起初,对于所有不同类型的objets,我的id都从0开始,因此成分的范围从0到大约100,项目从0到60,类型从0到7。但是由于我遇到了错误,我编辑了所有ID而且我仍然有错误,这非常令人困惑。
据我了解,这也可能是由于在不同线程中使用了上下文,但事实并非如此。如果删除崩溃的行,它将停止崩溃,并且可以在上下文中正确看到数据。在这种情况下,只有类型。如果仅在上下文中添加项目或成分,则由于相同的原因,它仅在另一个对象(成分或项目)中崩溃。
我应该从这里去哪里?我什至没有一个糟糕的解决方案,我可以尝试实现。我最糟糕的想法是手动更改ID(对我来说这很愚蠢,它应该与较旧的ID一起使用),但即使这样也失败了。