C# 使用JSON数据集作为EntityFramework数据库的种子

C# 使用JSON数据集作为EntityFramework数据库的种子,c#,json,database,entity-framework,C#,Json,Database,Entity Framework,我正在尝试在.netcoreapp 2.1中使用Microsoft.EntityFrameworkCore公开静态对象 我想公开的数据在一个.json文件中,我可以将其反序列化到相应的c#类中,而不会产生任何问题 以下是该结构的示例: 为了清楚起见,我建议你用你的 下面是这些对象的c版本: public class FoodItem { public int Id { get; set; } public string Name { get; set; } public

我正在尝试在
.netcoreapp 2.1
中使用Microsoft.EntityFrameworkCore公开静态对象

我想公开的数据在一个.json文件中,我可以将其反序列化到相应的c#类中,而不会产生任何问题

以下是该结构的示例:

为了清楚起见,我建议你用你的

下面是这些对象的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; }
}
我不明白为什么它抱怨重复的ID,因为它们都是一样的。除此之外,当我在一个项目中引用成分X时,显然有些项目将使用其他项目使用的成分(许多三明治有西红柿)。但这种关系肯定是允许的

起初,对于所有不同类型的对象,我的id从0开始,所以成分从0到大约100,项目从0到60,类型从0到7。但由于我有那个错误,我编辑了所有的Id,我仍然有这个错误,这是非常混乱的

据我所知,这也可能是由于在不同的线程中使用了上下文,但事实并非如此。如果我删除崩溃的行,它将停止崩溃,并且我可以正确地看到上下文中的数据。在本例中,只有类型。如果我只在上下文中添加项目或成分,它会因为同样的原因崩溃,只是在另一个对象(成分或成分)中崩溃


我应该从这里去哪里?我甚至没有一个糟糕的解决方案可以尝试实施。我最糟糕的想法是手动更改Id(这对我来说很愚蠢,它应该可以与旧的Id一起使用),但即使这样也失败了。

类型是否包含引用成分的子对象?不,成分和类型都包含“Id”和“名称”。他们都不平等。但即使我不同意,我也希望我的配料id从0开始,我的类型也一样。在我的SQL中,我的表总是从零开始,即使其他表从零开始。你可以在pastebin中查看json以非常清楚地了解对象关系,它们在C#中的映射完全相同,因此json包含一些重复项。
items
列表中也有成分,因此这将是一个问题。还有,为什么配料从零开始?这不是问题,但很奇怪,因为它以后会隐藏“空”值。它们毫无理由地从零开始,可以从1或764开始,我只是假设0是ID的良好开端。我可以改变这一点(尽管编辑json很痛苦:D)。这些物品含有这些成分,因为它们“应该”,就像它们的现实生活中的对应物一样。如果我希望我的
项目
由各种
成分
组成,如果不是将这些
成分的列表
作为
项目
的属性,我应该如何构造我的对象?我不希望它被复制,但我不知道如何制作它。
类型
是否包含以某种方式引用
成分
的子对象?不,成分和类型都包含“id”和“name”。他们都不平等。但即使我不同意,我也希望我的配料id从0开始,我的类型也一样。在我的SQL中,我的表总是从零开始,即使其他表从零开始。你可以在pastebin中查看json以非常清楚地了解对象关系,它们在C#中的映射完全相同,因此json包含一些重复项。
items
列表中也有成分,因此这将是一个问题。还有,为什么配料从零开始?这不是问题,但很奇怪,因为它以后会隐藏“空”值。它们毫无理由地从零开始,可以从1或764开始,我只是假设0是ID的良好开端。我可以改变这一点(尽管编辑json很痛苦:D)。这些物品含有这些成分,因为它们“应该”,就像它们的现实生活中的对应物一样。如果我希望我的
项目
由各种
成分
组成,如果不是将这些
成分的列表
作为
项目
的属性,我应该如何构造我的对象?我不想让它被复制,但我不知道还有什么办法可以复制。
    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();
    }