Linq to SQL DataContext终身管理问题

时间:2009-05-22 15:42:32

标签: c# linq linq-to-sql

我读了Rick Strahl的article关于处理数据上下文的方法。我的DBML在一个类库中,我通过在库中单独的自定义部分类中创建一个静态Current方法来打开我的数据上下文。

public partial class DataContext
{
    public static DataContext Current
    {
        get
        {
            DataContext dc = HttpContext.Current.Items["dc"] as DataContext;
            if (dc == null)
            {
                dc = new ImmediacyPageDataContext();
                HttpContext.Current.Items["dc"] = dc;
            }

            return dc;
        }
    }

然后像这样访问它

DataContext dc = DataContext.Current;

但是,每当我更新我的DBML文件时,这都会导致问题。在我尝试构建项目时编辑DBML文件后,我的设计器文件不会重新生成/被删除。如果我尝试运行自定义工具选项,则会返回错误。

我可以解决这个问题的唯一方法是重命名或删除自定义分部类,重新生成设计器文件,然后将我的自定义分部类添加回解决方案。这是一项工作,但是......它有点痛苦。

是否有更好的方法可以让我更轻松地编辑我的DBML文件,同时尽可能长时间地延长我的DC?

4 个答案:

答案 0 :(得分:5)

使用部分DataContext类进入代码文件,并将using语句移动到命名空间中。出于某种原因,除非是这种情况,否则该工具不会生成设计器。

namespace MyNamespace
{
    using System;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Reflection;
    using System.Xml.Linq;

    partial class DataContext
    {
    }
}

我认为从VS2008迁移到VS2008 SP1时需要进行此更改,但我可能会混合使用某些版本。

答案 1 :(得分:3)

您应该在不同的文件中创建部分类,而不是.designer.cs文件。最简单的方法是在解决方案资源管理器中右键单击DBML(或在DBML设计器的空白区域中),然后单击“查看代码”。这将创建一个新的.cs文件,在保存DBML时不会被覆盖。

答案 2 :(得分:3)

我不相信您的DataContext持久性和DBML问题是相关的。这听起来像IDE与Cached DataContext的冲突相混淆(HttpContext.Current.Items是按请求进行的,因此无论如何都没有长期缓存)。

当我的数据模型包含与另一个类冲突的类名时,我遇到了DBML编译问题。例如,名为“Application”(保险应用程序)的DBML对象可能与HttpApplicationState.Page.Application发生冲突。

检查错误消息,看看它是否特定于DBML中的名称。

答案 3 :(得分:0)

我想不出一个过于令人信服的理由,为什么你的新静态属性必须是DataContext类的一部分。将它放在不同的班级就好了。