«Серверу не удалось возобновить транзакцию» - рекомендации по использованию LINQ to Classes - PullRequest
1 голос
/ 20 июня 2011

Использование SQLSERVER 2008R2, VisualStudio 2010, .NET 4.0

Я получаю это периодическое исключение: «Серверу не удалось возобновить транзакцию - Desc 2000003» (изменение числа)

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

Как должны выглядеть мои классы?

Создать DataContext на уровне класса и использовать его во всех методах?

public class BusProcess
{

    RENDBDataContext db = new RENDBDataContext();

    public void Insert()
    {
        //Do stuff here...
        db.InsertProcedure(...);
    }
 }

Создать и разместить новый DataContext для каждого метода с помощью ()?

public class BusProcess
{

    public void Insert()
    {
        using(RENDBDataContext db = new RENDBDataContext())
        {
            //Do stuff here...
            int sample = db.SomeObject.SingleOrDefault(...).Id;
            db.InsertProcedure(...);
        }
    }
 }

Или, возможно, другой подход (передовой опыт) * ​​1015 *

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

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

Первое использование также может быть приемлемым, в зависимости от того, какдолгоживущий включающий класс есть - но в любом случае, убедитесь, что класс реализует IDisposable, избавьтесь от вложенного DataContext в вашей реализации Dispose() и оберните использования этого классас using().

1 голос
/ 20 июня 2011

Сочетание обоих.Используйте первый метод, но пусть ваши классы реализуют IDisposable и вызовите dispose для контекста в вашем классе dispose.Затем вы используете ваши классы в использовании операторов.Вы также можете передать DataContext в конструктор вашего класса для дополнительной гибкости.

1 голос
/ 20 июня 2011

Второй подход лучше, чем постоянный доступ к DataContext.Это предотвратит потребление памяти при вызове Load и т. Д. Также помните, что соединения объединяются в пул, поэтому создание нового DataContext не имеет большого значения.

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