所以我需要一些建议和见解。提前感谢您的想法。
我开发了从LINQ实体返回单个记录的静态函数。像这样:
FooRecord GetRecord(Guid id)
{
using(var dc = new FooDataContext())
return dc.FooRecords.Where(a => a.Id == id).First();
}
这会引发异常,因为DataContext已经被释放,这会导致延迟执行出现问题。这有效:
FooRecord GetRecord(Guid id)
{
var dc = new FooDataContext();
return dc.FooRecords.Where(a => a.Id == id).First();
}
我很担心。 DataContext的处理速度有多快?显然,如果我立即抓住这个记录,这不会引起问题。但是,我需要通过关联获取记录:
var record = Data.FooRecord.GetRecord(id);
//Do a bunch of stuff...
//Now we grab the related record from another entity
var barRecord = record.BarRecord
此时DataContext是否存在风险?有什么建议吗?
答案 0 :(得分:2)
由于这里讨论的原因,你基本上不需要Dispose()你的DataContext:
When should I dispose of a data context
http://csharpindepth.com/ViewNote.aspx?NoteID=89
在类型上实现IDisposable的主要原因是处置任何非托管资源。 DataContext分配的唯一非托管资源是底层数据库连接,但DataContext已根据需要负责打开和关闭连接。
您要避免的主要事情是返回一个IEnumerable集合,然后永远不会枚举它,因为这会导致连接无限期地保持打开状态。但是,由于您只返回一个对象,因此您不必担心这一点。
另请注意,如果访问返回对象上的任何关系属性,则可能导致暂时重新打开连接,以便可以延迟加载属性。您可以通过将DataLoadOptions.LoadWith()与DataContext一起使用来急切加载您要访问的任何属性,从而避免这种情况。见http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.aspx
至于问题的最后部分,如果返回的实体包含可以延迟加载的属性,那么它们将包含内部引用以支持将其保留在内存中的DataContext。一旦你没有对这些实体的更多引用,那么DataContext当然会像任何其他对象一样被垃圾收集。