Linq to SQL DataContext 生命周期管理问题

3

我读了Rick Strahl的文章,关于处理数据上下文的方法。我的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个回答

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时所需的,尽管我可能混淆了一些版本。


3

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


忘了提到这个部分类在一个单独的文件中。 - Jon Jones
如果您将部分文件命名为MyContext.partial.cs(而不是与主MyContext.dbml名称匹配的MyContext.cs),则IDE不会将您的部分文件与主dbml文件关联起来,因此您可以按任何方式格式化代码。 - Wayne Bloss

3
我不相信您的DataContext持久性和DBML问题有关。听起来像是IDE混淆了缓存的DataContext(HttpContext.Current.Items是每个请求的,所以没有长期缓存)而不是与之冲突。
当我的数据模型包含与其他类冲突的类名时,我遇到了DBML编译问题。例如,一个名为“Application”的DBML对象(一个保险申请)可能会与HttpApplicationState.Page.Application发生冲突。
检查您的错误消息,看看它是否与您的DBML中的名称有关。

0

我想不出为什么你的新静态属性必须是DataContext类的一部分,这并没有太大的说服力。把它放在另一个类中同样容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接