帮助我理解MY`Using`和`DataContext`

时间:2009-09-25 13:34:38

标签: c# linq linq-to-sql datacontext using

有人可以向我解释下面的内容。首先是我如何调用该方法,第二位是LINQ方法。

我的好奇是因为如果我取消评论context部分,我会收到using错误。

为什么呢?我显然不完全理解usingcontext'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;
    }

3 个答案:

答案 0 :(得分:6)

“使用”块会自动处理您正在使用的对象。由于您没有提供有关确切错误的更多详细信息,因此我认为它与“使用”将处理您的“上下文”相关,然后您将尝试再次使用您的上下文。

数据上下文应以原子方式使用。它们已经在内部被编码为高效的,通常没有合理的理由让它像你一样长时间运行。您看到大多数使用“使用”的示例的原因是因为它们在使用之前(或在其中)之前立即初始化了数据上下文,然后不尝试引用已处置的上下文。

最后一点,处理对象会导致它们释放所有内部内存引用(例如打开连接,缓存数据等)。

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

答案 1 :(得分:2)

如果您使用using,则会出现错误,因为GetAllMembers()第二次调用上下文处置

如果您需要处理我提取的上下文,您可以在GetAllMembers()中动态创建一个 ,而不是拥有静态上下文。

查看IDisposableusing的文档。

以下是一篇文章的链接,该文章可能会帮助您Lifetime Management of DataContext

答案 2 :(得分:2)

我遇到了这个问题,当时也不理解。我刚刚删除了使用它,它工作。问题是延迟加载。 DataContext给了我一个实体,但后来我尝试访问父实体的属性(在外键的意义上)。因为第一次没有加载这个父实体,所以它试图获取它,但DataContext已经消失了。所以我使用了DataLoadOptions。如果我知道我需要一个相关的实体,我会用原始实体加载它。

例如:您要求为您的datacontext发票,但稍后您想要访问客户的名称,例如invoice.Client.Name。客户端尚未加载,因此名称不可用。

DataLoadOptions对性能也很重要,如果你需要循环中的这个相关实体,如果你没有预先加载子(或父)实体,你将循环回到数据库。 / p>