保存时未将集合属性正确添加到父项
本文关键字:添加 属性 集合 保存 | 更新日期: 2023-09-27 18:29:07
看看下面的代码示例。
它的作用:
- 它吸引了一群客户。如果它已经知道该客户,它将检索该客户的现有数据库对象(这是问题重重的部分)。否则,它将创建一个新对象(这很好)
- 所有与社会保障号码匹配(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>();