【问题标题】:Entity Framework not adding multiple objects实体框架不添加多个对象
【发布时间】:2021-10-16 00:33:36
【问题描述】:

我正在尝试将一些虚拟内容添加到我的数据库中。我有一个名为“obj”的示例对象,我正在使用 for 循环插入数据,如下面的代码:

  public async Task<Post> Add(Post obj)
        {
            if (db != null)
            {
                obj.Id = 0;
                for (int i = 0; i < 100; i++)
                {
                    await db.Post.AddAsync(obj);
                }
                await db.SaveChangesAsync();

                return obj;
            }

            return null;
        }

但是,它确实只将 1 条记录添加到数据库中,您能解释一下这里出了什么问题吗?

【问题讨论】:

  • 你告诉 EF 一百次应该插入 obj (而对于可怜的东西来说一次就足够了)。而是应该插入不同的实例,所以你必须在循环中创建它们。

标签: asp.net-core .net-core entity-framework-core


【解决方案1】:

你可以在循环内创建帖子对象并重试吗?

for (int i = 0; i < 100; i++)                
{
   Post obj = new Post();
   await db.Post.AddAsync(obj);
}

【讨论】:

  • 感谢您的回复,我试过了,还是不行。
【解决方案2】:

如果您在调用保存的更改之前运行以下命令,您可以查看 EF Core 已排队的更改。

        var post = new Post();

        for (int i = 0; i < 10; i++)
        {
            
            await db.Posts.AddAsync(dev);
        }

        db.ChangeTracker.DetectChanges();

        Debug.WriteLine(db.ChangeTracker.DebugView.LongView);

        await db.SaveChangesAsync();

这将写信给 Debug 一个帖子正在被跟踪。

        for (int i = 0; i < 10; i++)
        {
            var post = new Post();
            await db.Posts.AddAsync(dev);
        }

        db.ChangeTracker.DetectChanges();

        Debug.WriteLine(db.ChangeTracker.DebugView.LongView);

        await db.SaveChangesAsync();

这将指向当前正在跟踪的 10 个帖子的调试窗口。

在您的代码中,当您 AddAsync(obj) 时,obj 不是新对象,EF Core 已经在跟踪 obj。

将 Post obj = new Post() 移动到循环中会为 EF Core 跟踪创建一个新对象。如果这些对象没有被添加到数据库中,我的猜测是它们不符合 Post 模型的要求。

随便玩玩

db.ChangeTracker.DetectChanges();

Debug.WriteLine(db.ChangeTracker.DebugView.LongView);

应该可以帮助您准确地追踪正在发生的事情。

希望这些信息对您有所帮助:)

【讨论】:

    【解决方案3】:

    您可以尝试使用AddRange

    public async Task<Post> Add(Post obj)
            {
                if (db != null)
                {
                   List<Post>=new List<Post>();
                    obj.Id = 0;
                    for (int i = 0; i < 100; i++)
                    {
                        l.Add(obj);
                    }
                    await db.Post.AddRangeAsync(l);
                    await db.SaveChangesAsync();
    
                    return obj;
                }
                return null;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多