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();
}