C# 提高datacontext save entityframework的性能
我在实体框架中使用带有工作单元的存储库模式,在尝试插入数据列表时面临性能问题 这是我的密码C# 提高datacontext save entityframework的性能,c#,asp.net-mvc,entity-framework,repository-pattern,unit-of-work,C#,Asp.net Mvc,Entity Framework,Repository Pattern,Unit Of Work,我在实体框架中使用带有工作单元的存储库模式,在尝试插入数据列表时面临性能问题 这是我的密码 var CurrentVersion = GlobalMethods.GetVersion(dFactory); var importedData = await GetImportData(); _uow.BeginTransaction(); try { foreach (v
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);
}
在上述情况下,似乎需要40到50秒才能在importedData对象中插入或更新450行。如果不执行savechanges()之类的数据库操作,该操作将在几秒钟内完成。如何在这种情况下提高绩效。谢谢尝试调用
\u uow.SaveChanges()代码>不在foreach
循环内。在\u uow.Commit()之前执行此操作代码>
尝试调用\u uow.SaveChanges()代码>不在foreach
循环内。在\u uow.Commit()之前执行此操作代码>
尝试调用\u uow.SaveChanges()代码>不在foreach
循环内。在\u uow.Commit()之前执行此操作代码>
尝试调用\u uow.SaveChanges()代码>不在foreach
循环内。在\u uow.Commit()之前执行此操作代码>
我需要从帐户中的商标和联系人中的帐户Id插入商标Id,因为它们是外键,accountData.TMID=trademarketdata.TMID;contactData.AccountID=accountData.AccountID;在循环外调用save changes不会获取我看到的那些外键。。嗯,您可以尝试为每个导入的项目创建一个DbContext。因为DbContext引用每个实体,这将减慢每次保存的速度。我需要从帐户中的商标和联系人中的帐户Id插入商标Id,因为它们是外键,accountData.TMID=trademarketdata.TMID;contactData.AccountID=accountData.AccountID;在循环外调用save changes不会获取我看到的那些外键。。嗯,您可以尝试为每个导入的项目创建一个DbContext。因为DbContext引用每个实体,这将减慢每次保存的速度。我需要从帐户中的商标和联系人中的帐户Id插入商标Id,因为它们是外键,accountData.TMID=trademarketdata.TMID;contactData.AccountID=accountData.AccountID;在循环外调用save changes不会获取我看到的那些外键。。嗯,您可以尝试为每个导入的项目创建一个DbContext。因为DbContext引用每个实体,这将减慢每次保存的速度。我需要从帐户中的商标和联系人中的帐户Id插入商标Id,因为它们是外键,accountData.TMID=trademarketdata.TMID;contactData.AccountID=accountData.AccountID;在循环外调用save changes不会获取我看到的那些外键。。嗯,您可以尝试为每个导入的项目创建一个DbContext。因为DbContext引用每个实体,这会降低每次保存的速度。
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);
}