代码之家  ›  专栏  ›  技术社区  ›  Gil Sand

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

  •  0
  • Gil Sand  · 技术社区  · 6 年前

    我正在尝试使用 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时,显然有些项目会使用其他项目使用的成分(许多三明治有西红柿)。但这种关系肯定是允许的。

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

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

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

    0 回复  |  直到 6 年前