LINQ to SQL SubmitChanges () Вставляет две строки базы данных и одну дочернюю строку - PullRequest
0 голосов
/ 04 сентября 2010

Я схожу с ума,

Я прикрепляю список с 1 строкой записи о клиенте и 1 адресе. Все кажется нормальным во время отладки. 1 строка клиента и 1 строка адреса должны быть вставлены. Но вместо этого я получаю 2 записи клиентов и 1 строку адреса.

Я не знаю почему. При присоединении и зацикливании внутри списка видна только 1 запись.

Есть ли очки?

[Изменено]

Код прилагается:

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;
        }
    }
}

Я проверил журнал в выходных данных и действительно вижу 2 вставки в таблице. Я ничего не вижу в адресе, но вставляю правильно.

Это может быть проблема с внешним ключом, я не понимаю.

1 Ответ

0 голосов
/ 04 февраля 2011

Полагаю, вы уже решили эту проблему, но я столкнулся с аналогичной проблемой и хотел сообщить о своем понимании этой проблемы для будущих пользователей.

Проблема, я полагаю, заключается в том, что вы используете существующий список объектов Customer, извлеченных из БД с использованием определенного DataContext. Затем вы создаете новый DataContext в своем методе, и с этим новым DataContext вы присоединяете объект Address.

Этот объект Address (при условии, что имеет отношение внешнего ключа к Customer) создает новый объект Customer в БД, поскольку DataContext, для которого вызывается SubmitChanges, originalCustomer также обрабатывается как новая запись.

Другими словами, чтобы избежать этих проблем, вы должны повторно использовать существующий DataContext, с помощью которого был выбран список originalCustomer List, чтобы при вставке дочерней записи Address не происходила запись в родительскую таблицу.

Надеюсь, это поможет.

...