将JSON数据集用作EntityFramework数据库的种子

时间:2019-02-22 15:29:46

标签: c# json database entity-framework

我正在尝试在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; }
}

尽管简单,但有ingredientstypesitems,项目基本上是三明治,它们是某种类型的三明治,并包含一系列配料。所有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一起使用),但即使这样也失败了。

0 个答案:

没有答案