在检索到Entity实例后,在其上设置DataContext

时间:2011-04-14 21:27:45

标签: vb.net linq-to-sql

我正在尝试找到一种方法,让实体中的DataContext可用。

我想做这样的事情:

partial public class MyEntity

    public DataContext as MyDataContext

    private sub OnLoaded()
        Me.DataContext = <the context that retrieved this instance>
    end sub

end class

首先,可以这样做吗? 其次,假设我不打算将此实体与任何其他DataContext一起使用,那么做这样的事情是否有任何危险或陷阱?

这是我目前的做法:

partial public class MyDataContext

    public function GetMyEntity(byval id as integer) as MyEntity
        dim o = MyEntities.SingleOrDefault(function(e) e.id = id)
        if o isnot nothing then o.DataContext = Me
        return o
    end function

end class

2 个答案:

答案 0 :(得分:2)

虽然您没有指明它的真正原因,但只有a sidenote from MSDN

  

通常,DataContext实例是。{   旨在持续一个“单位   工作“但你的应用程序定义   那个词。 DataContext是。{   轻便且不贵   创建。典型的LINQ to SQL   应用程序创建DataContext   方法范围或实例   昙花一现的成员   代表一组相关的逻辑   数据库操作。

和一个more

  

不要尝试重用实例   DataContext。每个DataContext   维持状态(包括身份   缓存)用于一个特定的编辑/查询   会话。获取新实例   在数据库的当前状态,   使用新的DataContext

最后,

  

......任何实例成员都不是   保证是线程安全的。

但在某些情况下,半持久性解决方案可能非常有用。看看Rick Strachl的文章:Linq to SQL DataContext Lifetime Management。其中审核了DataContext管理的不同方法。在他们身上 - 创建每个业务对象DataContext 正是您所需要的。

答案 1 :(得分:1)

你可以在DataContext上使用单例模式,但是你需要对它进行某种生命周期管理,因为保持它很长时间是不好的。 (请求结束处理它)

C#中的示例,但我希望您能理解它。

public class MyDataContext
{       
    public static MyDataContext Current 
    {
        get
        {
            MyDataContext context = (MyDataContext)HttpContext.Current.Items["Context"];
            if(context == null)
            {
                context = new MyDataContext();
                HttpContext.Current.Items["Context"] = context;
            }
            return context;
        }
    }
}

public class MyEntity
{
    public MyDataContext DataContext
    {
        get{ return MyDataContext.Current;}
    }
}

在Global.asax中,您可以挂钩事件Application_EndRequest并调用MyDataContext.Current.Dispose();手动处理上下文,而不是等待GC执行。