保存时未将集合属性正确添加到父项

本文关键字:添加 属性 集合 保存 | 更新日期: 2023-09-27 18:29:07

看看下面的代码示例。

它的作用:

  1. 它吸引了一群客户。如果它已经知道该客户,它将检索该客户的现有数据库对象(这是问题重重的部分)。否则,它将创建一个新对象(这很好)
  2. 所有与社会保障号码匹配(CPR)的贷款都将添加到新客户或现有客户中

问题是:它适用于新客户对象,但当我检索现有客户对象时,贷款在保存时会失去与客户的关系(CustomerID=null)。它们仍然保存到数据库中。

有什么想法吗?

protected void BuildCustomerData()
{
    Console.WriteLine("  Starting the customer build.");
    var counter = 0;
    var recycleCount = 100;
    var reportingCount = 100;
    var sTime = DateTime.Now;
    var q = from c in db.IntermediaryRkos
            select c.CPR;
    var distincts = q.Distinct().ToArray();
    var numbersToProcess = distincts.Count();
    Console.WriteLine("  Identified " + numbersToProcess + " customers. " + (DateTime.Now - sTime).TotalSeconds);
    foreach (var item in distincts)
    {
        var loans = from c in db.IntermediaryRkos
                    where c.CPR == item
                    select c;
        var existing = db.Customers.Where(x => x.CPR == item).FirstOrDefault();
        if (existing != null)
        {
            this.GenerateLoanListFor(existing, loans);
            db.Entry(existing).State = System.Data.EntityState.Modified;
        }
        else
        {
            var customer = new Customer
            {
                CPR = item,
            };
            this.GenerateLoanListFor(customer, loans);
            db.Customers.Add(customer);
            db.Entry(customer).State = System.Data.EntityState.Added;
        }
        counter++;
        if (counter % recycleCount == 0)
        {
            this.SaveAndRecycleContext();
        }
        if (counter % reportingCount == 0)
        {
            Console.WriteLine("    Processed " + counter + " customers of " + numbersToProcess + ".");
        }
    }
    db.SaveChanges();
}
protected void GenerateLoanListFor(Customer customer, IQueryable<IntermediaryRko> loans)
{
    customer.Loans = new List<Loan>();
    foreach (var item in loans.Where(x => x.DebtPrefix == "SomeCategory").ToList())
    {
        var transformed = StudentLoanMap.CreateFrom(item);
        customer.Loans.Add(transformed);
        db.Entry(transformed).State = System.Data.EntityState.Added;
    }
}

编辑1:

如前所述,我正在手动设置状态。这是由于RecycleContext调用,该调用是为了最大限度地提高数据库事务性能而实现的:

protected void SaveAndRecycleContext()
{
    db.SaveChanges();
    db.Dispose();
    db = new SolutionDatabase();
    db.Configuration.AutoDetectChangesEnabled = false;
    db.Configuration.ValidateOnSaveEnabled = false;
}

保存时未将集合属性正确添加到父项

无论是否存在贷款,您都会消灭客户。当您致电时贷款物业

customer.Loans = new List<Loan>();