C# Linq到SQL DataContext生存期管理问题

C# Linq到SQL DataContext生存期管理问题,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我读了Rick Strahl关于如何处理数据上下文的文章。我的DBML在类库中,我通过在库中一个单独的自定义分部类中创建一个静态当前方法来保持数据上下文的打开 public partial class DataContext { public static DataContext Current { get { DataContext dc = HttpContext.Current.Items["dc"] as DataC

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

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?

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

我认为DataContext持久性与DBML问题无关。听起来IDE与缓存的DataContext(HttpContext.Current.Items是每个请求的,因此没有长期缓存)冲突

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


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

使用部分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时需要进行此更改,尽管我可能混淆了一些版本。

我想不出一个非常有说服力的理由来解释为什么新的静态属性必须是DataContext类的一部分。将它放在另一个类中也很容易。

忘了提到分部类在单独的文件中。如果将分部文件命名为MyContext.partial.cs(而不是MyContext.cs,后者将与主MyContext.dbml的名称匹配)这样IDE就不会将您的部分文件与主dbml文件相关联,然后您可以按照自己喜欢的方式格式化代码。