我正在尝试找到一种方法,让实体中的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
答案 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执行。