1

有人可以向我解释以下内容。首先是我如何调用该方法,第二位是 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;
    }
4

3 回答 3

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;
}
于 2009-09-25T13:38:20.753 回答
2

如果你使用,你会得到一个错误,using因为上下文在第二次被调用时被释放GetAllMembers()

如果您需要处理上下文,我建议您在 GetAllMembers() 中动态创建一个而不是使用静态上下文。

查看IDisposable和的文档using

这是一篇文章的链接,该文章可能会帮助您进行 DataContext 的生命周期管理

于 2009-09-25T13:46:54.410 回答
2

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

例如:您要求为您的数据上下文提供发票,但稍后您想访问客户的姓名,例如在 invoice.Client.Name 中。客户端尚未加载,因此名称不可用。

DataLoadOptions 对性能也很重要,如果您在循环中需要此相关实体,如果您不预加载子(或父)实体,您将在循环中多次返回数据库。

于 2009-10-01T02:10:07.800 回答