c# - Entity Framework 更新/插入多个实体

标签 c# sql-server entity-framework

只是我要完成的事情的概述。 我们在我们的应用程序中保留远程数据库(第 3 方)的本地副本。我们使用 api 下载信息。 我们目前按计划下载信息,然后将新记录插入本地数据库或更新现有记录。 这是它目前的工作方式

public void ProcessApiData(List<Account> apiData)
{
     // get the existing accounts from the local database
     List<Account> existingAccounts = _accountRepository.GetAllList();

     foreach(account in apiData)
     {
         // check if it already exists in the local database
         var existingAccount = existingAccounts.SingleOrDefault(a => a.AccountId == account.AccountId);

         // if its null then its a new record
         if(existingAccount == null)
         {
             _accountRepository.Insert(account);
             continue;
         }

         // else its a new record so it needs updating
         existingAccount.AccountName = account.AccountName;

         // ... continue updating the rest of the properties
     }

     CurrentUnitOfWork.SaveChanges();
}

这很好用,但感觉还可以改进。

  1. 每个实体都有一个这些方法,它们都做同样的事情(只是更新不同的属性)或插入不同的实体。无论如何,是否可以使它更通用?
  2. 似乎有很多数据库调用,无论如何“批量”执行此操作。我看过这个包,我在其他一些帖子中看到过它 https://github.com/loresoft/EntityFramework.Extended 但它似乎专注于批量更新具有相同值的单个属性,或者我可以这么说。

任何关于我如何改进它的建议都会很棒。我对 C# 还是很陌生,所以我仍在寻找最好的做事方式。

我正在使用 .net 4.5.2 和 Entity Framework 6.1.3 以及 MSSQL 2014 作为后端数据库

最佳答案

对于 EFCore,您可以使用此库:
https://github.com/borisdj/EFCore.BulkExtensions
注意:我是这本书的作者。

对于 EF 6,这个:
https://github.com/TomaszMierzejowski/EntityFramework.BulkExtensions

两者都使用批量操作扩展 DbContext 并且具有相同的语法调用:

context.BulkInsert(entitiesList);
context.BulkUpdate(entitiesList);
context.BulkDelete(entitiesList);

EFCore 版本有额外的 BulkInsertOrUpdate 方法。

关于c# - Entity Framework 更新/插入多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39656794/

相关文章:

c# - 我正在发布我的软件。我必须使用 .net 混淆器吗?

c# - 向 OData Web API Controller 添加自定义导航属性

c# - MailKit发件人地址

c# - 在 EF6 和 ASP.NET 中同时使用多个 DbContext 实例

c# - 如何使用 C# 中的 linq 检查存储在具有给定值的数据库列中的逗号分隔值

c# - ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法使用相同的键跟踪多个对象

c# - Razor 中的预处理器指令

sql-server - DBMS 性能调优书籍推荐

sql - Scope_Identity()、Identity()、@@Identity 和 Ident_Current() 之间有什么区别?

sql-server - 将表格的两列合并到第三列中