提高数据上下文保存实体框架的性能

本文关键字:实体 保存 框架 性能 上下文 高数据 数据 | 更新日期: 2023-09-27 18:05:39

我在实体框架中使用工作单元的存储库模式,当尝试插入数据列表时,我面临性能问题。

这是我的代码

var CurrentVersion = GlobalMethods.GetVersion(dFactory);
            var importedData = await GetImportData();
            _uow.BeginTransaction();
            try
            {
                foreach (var item in importedData)
                {
                        Account accountData = new Account()
                        {
                            AccountSiebelCode = item.account_code,
                            AccountName = item.account_name,
                            AccountZip = "",
                            CountryID = 1,
                            AccountRegistration = "",//null allowed
                            AccountDisabled = item.account_status != "active" ? true : false,
                            TMID = 0, //Trademark Id
                            AccountAreaNr = "",
                            Audit_User = User.Identity.Name,
                            VersionDataID = CurrentVersion.Item2,
                            VersionAction = "",//Set at Business
                            TokenKey = GlobalMethods.GetTokenAsync().Result
                        };
                        //string contactUserName = "";
                        string contactUserName = item.last_name.Replace(" ", "").Count() > 4 ? item.last_name.Replace(" ", "").Substring(0, 4) : item.last_name.Replace(" ", "");
                        contactUserName += item.first_name.Substring(0, 1).ToString();
                        Microsoft.AspNet.Identity.PasswordHasher haspwd= new Microsoft.AspNet.Identity.PasswordHasher();
                        Contact contactData = new Contact()
                        {
                            ContactSiebelCode = item.account_code,
                            AccountID = 0, //Account Id
                            ContactFirstName = item.first_name,
                            ContactLastName = item.last_name,
                            ContactTitle = "",
                            ContactType = "",
                            ContactDOB = DateTime.Now, // Dob
                            ContactEmail = item.email,
                            ContactMobile = "",
                            ContactPhone = item.phonenumber,
                            ContactDisabled = false, //contact disabled
                            ContactAppEnabled = true, //contact app enabled
                            UserName = contactUserName, //username
                            //PasswordHash = BCryptEncryption.Encrypt("Gr@fi0ffshore"), //password
                            //PasswordHash = haspwd.HashPassword("Gr@fi0ffshore"), //password
                            PasswordHash ="R1-"+ System.Web.Security.Membership.GeneratePassword(6,1), //password
                            PinCode = "1234", //picode
                            LockOutEnabled = false, //lockout
                            AccessFailedCount = 0, //accessfailedcount
                            Audit_User = User.Identity.Name,
                            VersionDataID = CurrentVersion.Item2,
                            VersionAction = "",//Set at Business
                            TokenKey = GlobalMethods.GetTokenAsync().Result
                        };
                        TradeMarketer tradeMarketerData = new TradeMarketer()
                        {
                            TMSiebelCode = item.account_code,
                            TMFirstName = item.trade_marketeer_firstname,
                            TMLastName = item.trade_marketeer_lastname,
                            TMEmail = "",
                            TMAreaNr = item.region,
                            CountryID = 1, //country id
                            Audit_User = User.Identity.Name,
                            VersionDataId = CurrentVersion.Item2,
                            VersionAction = "",//Set at Business
                            TokeyKey = GlobalMethods.GetTokenAsync().Result
                        };
                        _biznessTradeMarketer.Save(tradeMarketerData);
                        _uow.SaveChanges();
                        accountData.TMID = tradeMarketerData.TMID;
                        _biznessAccount.Save(accountData);
                        _uow.SaveChanges();
                        contactData.AccountID = accountData.AccountID;
                        _biznessContact.Save(contactData);
                        _uow.SaveChanges();
                }
                _uow.Commit();
            }
            catch (Exception ex)
            {
                _uow.Rollback();
                ModelState.AddModelError("", ex.InnerException);
            }

在上面的例子中,为了在importdata对象中插入或更新450行,似乎需要40到50秒。如果不执行savechanges()等数据库操作,操作将在几秒钟内完成。在这种情况下,我该如何提高绩效?由于

提高数据上下文保存实体框架的性能

尝试调用不在foreach循环内的_uow.SaveChanges();。就在_uow.Commit();之前。

var CurrentVersion = GlobalMethods.GetVersion(dFactory);
            var importedData = await GetImportData();
            _uow.BeginTransaction();
            try
            {
                foreach (var item in importedData)
                {
                        Account accountData = new Account()
                        {
                            AccountSiebelCode = item.account_code,
                            AccountName = item.account_name,
                            AccountZip = "",
                            CountryID = 1,
                            AccountRegistration = "",//null allowed
                            AccountDisabled = item.account_status != "active" ? true : false,
                            TMID = 0, //Trademark Id
                            AccountAreaNr = "",
                            Audit_User = User.Identity.Name,
                            VersionDataID = CurrentVersion.Item2,
                            VersionAction = "",//Set at Business
                            TokenKey = GlobalMethods.GetTokenAsync().Result
                        };
                        //string contactUserName = "";
                        string contactUserName = item.last_name.Replace(" ", "").Count() > 4 ? item.last_name.Replace(" ", "").Substring(0, 4) : item.last_name.Replace(" ", "");
                        contactUserName += item.first_name.Substring(0, 1).ToString();
                        Microsoft.AspNet.Identity.PasswordHasher haspwd= new Microsoft.AspNet.Identity.PasswordHasher();
                        Contact contactData = new Contact()
                        {
                            ContactSiebelCode = item.account_code,
                            AccountID = 0, //Account Id
                            ContactFirstName = item.first_name,
                            ContactLastName = item.last_name,
                            ContactTitle = "",
                            ContactType = "",
                            ContactDOB = DateTime.Now, // Dob
                            ContactEmail = item.email,
                            ContactMobile = "",
                            ContactPhone = item.phonenumber,
                            ContactDisabled = false, //contact disabled
                            ContactAppEnabled = true, //contact app enabled
                            UserName = contactUserName, //username
                            //PasswordHash = BCryptEncryption.Encrypt("Gr@fi0ffshore"), //password
                            //PasswordHash = haspwd.HashPassword("Gr@fi0ffshore"), //password
                            PasswordHash ="R1-"+ System.Web.Security.Membership.GeneratePassword(6,1), //password
                            PinCode = "1234", //picode
                            LockOutEnabled = false, //lockout
                            AccessFailedCount = 0, //accessfailedcount
                            Audit_User = User.Identity.Name,
                            VersionDataID = CurrentVersion.Item2,
                            VersionAction = "",//Set at Business
                            TokenKey = GlobalMethods.GetTokenAsync().Result
                        };
                        TradeMarketer tradeMarketerData = new TradeMarketer()
                        {
                            TMSiebelCode = item.account_code,
                            TMFirstName = item.trade_marketeer_firstname,
                            TMLastName = item.trade_marketeer_lastname,
                            TMEmail = "",
                            TMAreaNr = item.region,
                            CountryID = 1, //country id
                            Audit_User = User.Identity.Name,
                            VersionDataId = CurrentVersion.Item2,
                            VersionAction = "",//Set at Business
                            TokeyKey = GlobalMethods.GetTokenAsync().Result
                        };
                        _biznessTradeMarketer.Save(tradeMarketerData);
                        accountData.TMID = tradeMarketerData.TMID;
                        _biznessAccount.Save(accountData);
                        contactData.AccountID = accountData.AccountID;
                        _biznessContact.Save(contactData);
                }
                _uow.SaveChanges();
                _uow.Commit();
            }
            catch (Exception ex)
            {
                _uow.Rollback();
                ModelState.AddModelError("", ex.InnerException);
            }