添加或更新 EF Core7

Add Or Update EF Core7

提问人:TrialByFire 提问时间:11/13/2023 最后编辑:marc_sTrialByFire 更新时间:11/14/2023 访问量:57

问:

使用 Entity Framework Core 7 实现添加或更新的最有效方法是什么?IEnumerable<MyEntity> myentities

尝试遍历每个项目,并

myDBContext.CustomAddUpdate(item);
myDBContext.SaveChanges();

CustomAddUpdate方法使用给定实体的条目,并获取状态 Add 或 Update。DBContext

C# dbcontext ef-core-7.0

评论

4赞 Dai 11/13/2023
有效的方法是使用 ,另一种有效的方法是使用表值参数作为原始 SQL。以任何方式使用 EF 都会很懒散,因为它必须执行 RBAR。BULK INSERTMERGE
1赞 TrialByFire 11/13/2023
@Fildor 抱歉:无法编辑问题,因此添加了代码作为注释,并且只介绍了两种情况以保持简单
1赞 Panagiotis Kanavos 11/13/2023
@TrialByFire EF 是 ORM,而不是数据库驱动程序。所有 ORM 的工作都是给人一种使用内存中对象的印象,而不是表和行。根据定义,这比任何批量操作或 SQL 都慢。不需要单个对象,因为 DbContext 已经知道它跟踪的对象的状态。如果要附加新项目,或者将根据其主键值和配置以“已添加”或“已修改”状态附加它们。调用时,将插入所有 Added 对象,更新所有 Modified 对象AddOrUpdateUpdateUpdateRangeSaveChanges
1赞 Panagiotis Kanavos 11/13/2023
@TrialByFire也不会将代码添加为注释。该注释显示了尝试执行 EF 本身自动执行的操作,并且除了可能导致错误之外没有任何效果:如果对象处于“已添加”状态,请添加它。但它已经添加了,所以这没有意义。和 相同ModifiedUpdate
1赞 Morten Bork 11/14/2023
@Dai 我同意框架包这样很烦人,但 EF-CORE 本身就是一个框架包。如果它获得新的更新,虽然在开发新扩展之前您将不得不保留旧版本,但其中一些 nuget 扩展是开源的。在这种情况下,请编写一个新的扩展,该扩展确实适用于较新版本的 EF .net

答:

1赞 Lucky 11/20/2023 #1

您好,我想我明白您想做什么,请查看以下方法是否适合您:

public void AddOrUpdateRange(IEnumerable<MyEntity> myentities)
    {        
        var listForAddEntities= new List<MyEntity>();
        var listForUpdateEntities= new List<MyEntity>();

        foreach (MyEntity entity in myentities)
        {
            var entry = Entry(entity);
            switch (entry.State)
            {
                case EntityState.Detached:
                case EntityState.Added:
                    listForAddEntities.Add(entity);
                    break;
                case EntityState.Modified:
                    listForUpdateEntities.Add(entity);
                    break;
                //For Unchanged nothing to do

                default:
                    //anything you want to do
            }
        }
        AddRange(listForAddEntities);
        UpdateRange(listForUpdateEntities);
    }

评论

0赞 TrialByFire 11/20/2023
检查中,将更新。谢谢