gpt4 book ai didi

c# - EntityFramework 等待操作在长时间运行的任务上超时

转载 作者:行者123 更新时间:2023-11-30 22:13:17 26 4
gpt4 key购买 nike

我正在使用 EF5 将一些数据从一个数据库迁移到另一个数据库。我通常会使用 SQL 来做这样的事情,但是我需要其他功能(比如在 MembershipProvider 中创建用户)并且希望在 EF 中完成这一切。我正在迁移大约 10 万行并使用它来这样做:

        using (var connection = new SqlConnection(connectionString))
{
using(var command = new SqlCommand(commandText, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
var employer = new Employer();

employer.EAN = reader["EAN"].ToString();

employer.Name = GetString(reader["EmpName"]);

employer.TaxMailingAddress = new Address
{
StreetAddress = GetString(reader["Street"]),
City = GetString(reader["City"]),
State = GetString(reader["USState"]),
ZipCode = GetString(reader["Zip"])
};

employer.TaxMailingAddress.SaveOrUpdate();
employer.SaveOrUpdate(); // This is where the timeout happens

string dba = GetString(reader["DBA"]);
if (!string.IsNullOrWhiteSpace(dba))
{
employer.AddDBA(new EmployerDba
{
Name = dba
});
}

string email = GetString(reader["Email"]);
if (!string.IsNullOrWhiteSpace(email))
{
var user = CreateNewUser(email);

if (user != null)
{
user.AddAuthorizedEmployer(employer);

user.AddRole(EmployerRole.Admin, employer, true);
}
}
}
}
}
}

我的 SaveOrUpdate 方法非常简单:

    public void SaveOrUpdate()
{
using (var db = new MyContext())
{
if (db.Employers.FirstOrDefault(x => x.EAN == EAN && x.Id != Id) != null)
throw new Exception("An employer with this EAN has already been registered.");

var employer = new Employer();

if (Id == 0)
{
db.Employers.Add(employer);

employer.CreatedBy = Statics.GetCurrentUserName();
employer.DateCreated = DateTime.Now;
}
else
{
employer = db.Employers.FirstOrDefault(x => x.Id == Id);

employer.ModifiedBy = Statics.GetCurrentUserName();
employer.DateModified = DateTime.Now;
}

employer.EAN = EAN;
employer.Name = Name;
if (TaxMailingAddress != null) employer.TaxMailingAddress = db.Addresses.FirstOrDefault(x => x.Id == TaxMailingAddress.Id);
if (SingleSeparationStatementAddress != null) employer.SingleSeparationStatementAddress = db.Addresses
.FirstOrDefault(x => x.Id == SingleSeparationStatementAddress.Id);

db.SaveChanges();

Id = employer.Id;
}
}

该任务大约需要 2.5 小时才能完成。然而,在运行了数千行之后,有时是 80k,有时是 7k,我得到了这个 “等待操作超时” 异常,总是在 employer.SaveOrUpdate();。它与 employer.TaxMailingAddress.SaveOrUpdate(); 的接近程度有什么关系吗?是否有“等待交易完成”的交易?也许确保连接有效,如果不是,请尝试重新创建它或其他什么?感谢您的帮助。

最佳答案

问题最终是我用来连接到另一个数据库的初始数据库连接超时了,我从中获取要导入的数据。所以我最终循环遍历所有 reader.Read() 语句并将其放入一个数组中。然后我遍历该数组以实际处理数据并将其保存到我的新数据库中。

关于c# - EntityFramework 等待操作在长时间运行的任务上超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com