Вопрос

Может кто-нибудь, пожалуйста, объяснить мне нижеприведенное.Первый - это то, как я вызываю метод, а второй бит - это метод LINQ.

Мое любопытство проистекает из того факта, что я получаю context ошибка, если я не буду комментировать using порция.

Почему?Я, по-видимому, не до конца понимаю using и context's.И я хотел бы лучше понять это.

Guid workerID = new Guid(new ConnectDAL.DAL.Security().GetUserIDByUserLogin(HUD.CurrentUser));

        var myMembers = BLLCmo.GetAllMembers(workerID);
        if (myMembers.Rows.Count != 0)
        {
            dgvMyMembers.DataSource = myMembers;
        }
        else
        {
            var allMembers = BLLCmo.GetAllMembers();
            dgvMyMembers.DataSource = allMembers;
        }




    internal static CmoDataContext context = new CmoDataContext();

    public static DataTable GetAllMembers()
    {
        DataTable dataTable;

        //using (context)
        //{
            var AllEnrollees = from enrollment in context.tblCMOEnrollments
                               select new
                                       {
                                           enrollment.ADRCReferralID,
                                           enrollment.ClientID,
                                           enrollment.CMONurseID,
                                           enrollment.CMOSocialWorkerID,
                                           enrollment.DisenrollmentDate,
                                           enrollment.DisenrollmentReasonID,
                                           enrollment.EconomicSupportWorkerID,
                                           enrollment.EnrollmentDate
                                       };

            dataTable = AllEnrollees.CopyLinqToDataTable();
        //}
        return dataTable;
    }
Это было полезно?

Решение

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

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

В заключение отметим, что удаление объектов приводит к тому, что они освобождают все свои ссылки на внутреннюю память (такие как открытые соединения, кэшированные данные и т.д.).

//Our context exists right now ... unless we've already called this method since the app started ;)
var myMembers = BLLCmo.GetAllMembers(workerID); // Context is disposed at the end of this call
if (myMembers.Rows.Count != 0)
{
  dgvMyMembers.DataSource = myMembers;  //No prob, we didn't call our function again
}
else
{
  var allMembers = BLLCmo.GetAllMembers();  // Oops, our context was disposed of earlier
  dgvMyMembers.DataSource = allMembers;
}

Другие советы

Вы получите сообщение об ошибке, если вы используете using потому что контекст таков утилизированный во второй раз это вызывается GetAllMembers().

Если вам нужно избавиться от контекста, я предлагаю вам создать его на лету в GetAllMembers() в отличие от наличия статического контекста.

Ознакомьтесь с документацией по IDisposable и using.

Вот ссылка на статью, которая может помочь вам с Пожизненное управление DataContext.

У меня была эта проблема, и в то время я тоже ее не понимал.Я просто удалил using, и это сработало.Проблема заключалась в ленивой загрузке.DataContext предоставил мне объект, но позже я попытался получить доступ к свойству родительского объекта (в смысле внешнего ключа).Поскольку этот родительский объект не был загружен в первый раз, он попытался получить его, но DataContext исчез.Поэтому я использовал DataLoadOptions.Если бы я знал, что мне нужна связанная сущность, я загрузил бы ее вместе с исходной сущностью.

Бывший:Вы запрашиваете счет-фактуру для вашего datacontext, но позже вы хотите получить доступ к имени клиента, как в счете-фактуре.Client.Name.Клиент не был загружен, поэтому имя недоступно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top