我读了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?
答案 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类的一部分。将它放在不同的班级就好了。