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

标签 c# entity-framework entity-framework-5 timeoutexception

我正在使用 EF5 将一些数据从一个数据库迁移到另一个数据库。我通常会使用 SQL 来完成类似的操作,但我需要其他功能(例如在 MembershipProvider 中创建用户),并希望在 EF 中完成这一切。我正在迁移大约 100k 行并使用它来执行此操作:

        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/

相关文章:

c# - 接受谓词和 orderby 的存储库方法

c# - "EntityType has no key defined"异常,尽管键是用 HasKey 定义的

c# - 如何在文本属性中放置不同的文本格式和超链接

c# - 找到下一个位置知道纬度/经度/航向/速度

c# - Breeze 自定义操作

entity-framework - Entity Framework 检查本地列表

entity-framework - Entity Framework 和SQL Server 2012分页

c# - Entity Framework 5 种复杂类型

c# - 如果我不需要它的所有功能,我该如何实现一个接口(interface)?

C# 按 LINQ 和 Datatable 对字段进行分组时无法使用 CopyToDataTable() 函数