我让这让我发疯,
我正在附加一个包含1个客户和1个地址子记录行的列表。 调试时一切似乎都没问题。应插入1个客户行和1个地址行。 但相反,我得到2个客户记录和1个地址行。
我不知道为什么。在List中仅附加和循环时只看到1条记录。
任何要点?
[EDITED]
附加代码:
public bool InsertUpdateCustomers(List<Customer> customerList, List<Customer> originalCustomers)
{
using (DbContext db = new DbContext(DbContext.ConnectionString))
{
db.Log = Console.Out;
List<Customer> customerCloned = new List<Customer>();
customerList.ForEach(p => customerCloned.Add(p.CloneObjectGraph()));
customerCloned.ForEach(p => p.Address =
customerList.Where(pe => pe.Id == p.Id).Single().Address.CloneObjectGraph());
customerCloned.ForEach(p =>
{
if (p.Id > 0)
{
db.Customer.Attach(p,
originalCustomers.Single(
x => x.Id == p.Id));
db.Address.Attach(p.Address,
originalCustomers.Single(
x => p.AddressId== x.AddressId).
Address);
}
});
customerCloned.ForEach(p =>
{
if (p.Id == 0)
db.Customer.InsertOnSubmit(p);
});
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
我已经检查了输出中的Log,我确实在表中看到了2个Inserts。 我没有看到地址,但插入正确。
这可能是我无法解决的外键问题。
答案 0 :(得分:0)
我想你现在已经解决了这个问题,但我遇到了类似的问题,并希望向未来的用户报告我对这个问题的理解。
我认为,问题在于您使用的是使用特定DataContext从DB检索到的现有Customer对象列表。然后,在方法中创建一个新的DataContext,使用这个新的DataContext,您将附加一个Address对象。
此Address对象(假设与Customer具有外键关系)在DB中创建一个新的Customer对象,因为调用SubmitChanges的DataContext,originalCustomer也被视为新记录。
换句话说,为了避免这些问题,您必须重新使用用于获取原始客户列表的现有DataContext,以便插入Address的子记录不会触发到父表的输入。
希望这有帮助。