Linq to SQL - обработка ошибок - PullRequest
4 голосов
/ 10 мая 2010

У меня есть оператор linq to sql, который вставляет записи в базу данных. Если есть дубликат, генерируется нарушение первичного ключа.

после того, как это произойдет, всякий раз, когда я пытаюсь выполнить любое другое утверждение, оно постоянно показывает эту ошибку Это проблема сделки не закрывается. Также, как обрабатывать транзакции более надежным способом в LINQ to SQL

Ответы [ 4 ]

4 голосов
/ 10 июня 2010

Каждый экземпляр DataContext отслеживает экземпляры классов сопоставления, которые он видел. Когда вы говорите: myDataContext.InsertOnSubmit(myCustomer);, вы регистрируете экземпляр клиента с этим DataContext. Позже, когда вы говорите myDataContext.SubmitChanges();, DataContext пытается выполнить все отслеживаемые изменения.

  • Если эти изменения не выполняются - DataContext не прекращает их отслеживать и будет пытаться вносить изменения каждый раз, когда вызывается SubmitChanges.

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

1 голос
/ 05 июня 2010

Если ваше поле первичного ключа является полем идентификации, НЕ заполняйте его при вставке в базу данных.Например, для таблицы Customer со следующей структурой:

Customer
========
Customer_ID (PK, identity)
Last_Name (varchar)
First_Name (varchar)
Middle_Initial (char)

это возможно:

public int CreateCustomer(string lastName, string firstName, string middleInitial) 
{
    using (DataContext dc = new DataContext())
    {
        Customer customer = new Customer();

        customer.Last_Name = lastName;
        customer.First_Name = firstName;
        customer.Middle_Initial = middleInitial;
        dc.Customers.InsertOnSubmit(customer);
        dc.SubmitChanges();

        return customer.Customer_ID;
    }   
}

Наиболее вероятной причиной вашей ошибки является то, что вы пытаетесь получить доступ к сущностиобъект после DataContext, в котором он был создан, был уничтожен.Используя приведенный выше пример, вы получите ошибку, аналогичную той, которую вы, вероятно, получаете:

public int CreateCustomer(string lastName, string firstName, string middleInitial) 
{
    using (DataContext dc = new DataContext())
    {
        Customer customer = new Customer();

        customer.Last_Name = lastName;
        customer.First_Name = firstName;
        customer.Middle_Initial = middleInitial;
        dc.Customers.InsertOnSubmit(customer);
        dc.SubmitChanges();
    }   

    return customer.Customer_ID;   // <<-- Error occurs here
}

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

Что касается обработки транзакций, транзакция создается, когдаDataContext создан.Когда вызывается SubmitChanges, все изменения выполняются в контексте транзакции DataContext, независимо от количества задействованных сущностей / таблиц.

0 голосов
/ 10 мая 2010

Почему бы не проверить дубликат записи, прежде чем пытаться сохранить запись?

Бросать исключения очень дорого.

0 голосов
/ 10 мая 2010

Вы повторно используете тот же DataContext? Если это так, не делайте этого - создайте новый DataContext для каждой логической операции и используйте TransactionScope для управления транзакциями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...