我什么时候可以处理我的DataContext?

时间:2009-12-16 20:59:04

标签: c# linq-to-sql datacontext

采用以下示例:

MyDataContext context = new MyDataContext(); // DB connection established.
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity

假设我的实体与我将通过

访问的其他表有关系

foreach (var record in MyEntity.RelatedTable)

我是否需要在第二行之后保持我的DataContext存活才能访问实体的属性或者它是否足够安全处理?

我理解Linq to SQL使用延迟执行因此我想知道它是否仅在您最初检索实体时使用延迟执行,或者在访问相关表记录时是否使用它。

实施例

var userRepo = new UserRepository(); // creates new DataContext
var auditRepo = new AuditRepository(); // creates new DataContext
var activeUsers = userRepo.FindActiveUsers();
foreach (var user in activeUsers)
{
    // do something with the  user
    var audit = new Audit();
    audit.Date = DateTime.Now;
    audit.UserID = user.ID;
    auditRepo.Insert(audit);
}

我在repo中的插入方法调用SubmitChanges。以上是可以接受的,或者这是浪费连接。我应该现实地做:

var userRepo = new UserRepository();
var activeUsers = userRepo.FindActiveUsers();
foreach (var user in activeUsers)
{
    // do something with user
    var audit = new Audit();
    audit.Date = DateTime.Now;
    audit.UserID = user.ID;
    user.Audits.Add(audit);
    userRepo.Save();
}

重新使用已经打开的DataContext?如果我打开一个高级别的datacontext然后不得不做一些低级别的处理,你会做什么呢?我应该将userRepo传递给我,还是应该创建一个单独的存储库?

2 个答案:

答案 0 :(得分:4)

要访问其他表中的字段,您需要保持DataContext的活动状态。另外,不要直接调用dispose,使用using关键字。

using (MyDataContext context = new MyDataContext()) // DB connection established.
{
    MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity

    foreach (var record in MyEntity.RelatedTable)
    {
        ...
    }
}

答案 1 :(得分:3)

您不需要处理DataContext,因为它是一个轻量级对象,并且缓存了所有内部数据库连接。如果您处置它,您将无法访问相关实体。