Pergunta

Alguém pode explicar o baixo para mim. Em primeiro lugar é como eu chamo o método e o segundo bit é o Método LINQ.

A minha curiosidade decorre do fato de que eu recebo um erro context se eu un-comentário a parte using.

Por quê? Eu aparentemente não compreender totalmente using e context's. E eu gostaria de entender melhor isso.

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;
    }
Foi útil?

Solução

"usando" blocos descartar automaticamente do objeto que você está usando. Desde que você não deu mais detalhes sobre o que o erro exato é, eu estou apostando sua relacionado ao fato de que o "usando" irá desfazer do seu "contexto", e, em seguida, mais tarde você vai tentar usar seu contexto novamente.

Dados Contextos deve ser usado atomicamente. Eles já estão codificados internamente para ser eficiente dessa forma, não há razão geralmente não justificável para ter um tão longa quanto você. A razão que você vê a maioria das amostras que utilizam um "usando" é porque eles têm o contexto de dados inicializado imediatamente antes do uso (ou no mesmo) e, em seguida, não tente referenciada contexto descartado.

Como nota final, eliminação de objetos faz com que eles para liberar todas as suas referências de memória interna (tais como ligações abertas, os dados em cache, etc).

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

Outras dicas

Você receberá um erro se você usar using porque o contexto é dispostos a segunda vez que ele é chamado por GetAllMembers().

Se você precisa descartar contexto I Sugerir você cria um na mosca nos GetAllMembers () ao invés de ter um contexto estático.

Confira a documentação do IDisposable e using .

Aqui está um link para um artigo que pode ajudá-lo com Gestão Lifetime de DataContext .

Eu tive este problema e não entendia tanto naquela época. Eu só removeu a usar e funcionou. O problema era preguiçoso Carregando. O DataContext me deu uma entidade, mas mais tarde eu tentei acessar uma propriedade de uma entidade pai (no sentido de uma chave estrangeira). Porque esta entidade pai não foi carregado pela primeira vez, ele tentou obtê-lo, mas o DataContext tinha desaparecido. Então eu usei um DataLoadOptions. Se eu sabia que precisava de uma entidade relacionada, eu carregá-la com a entidade originais.

Ex: Você pedir uma factura ao seu datacontext, mas depois você deseja acessar o nome do cliente, como em invoice.Client.Name. O cliente não foi carregado, por isso o nome não está disponível.

DataLoadOptions também são importantes para o desempenho, se você precisa deste entidade relacionada em um loop, você vai voltar para o DB como muitas vezes como você loop se você não pré-carregar a entidade filho (ou pai).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top