LINQtoSQL,存储库模式和延迟加载

时间:2010-10-07 14:00:08

标签: linq-to-sql repository repository-pattern

如何将LINQtoSQL与存储库模式一起使用?

我是L2S的新手,发现它的延迟加载是使用repo模式的真正障碍。

通常,我会想到这样的存储库模式:

var myCustomer = null;

using (var myRepo = new Repo()){
    myCustomer = myRepo.GetCustomerForCustomerId(123);
}

if(myCustomer.Orders.Any()){
 //do something
}

麻烦的是,当myCustomer.Orders被询问时,L2S是否会尝试建立数据连接?这是否会导致无法预测的数据库访问问题?

我的意思是,是的,我可以告诉我的回购邮件验证回购内部的订单,确信我们的完整测试覆盖率验证开发人员从不调用我们没有明确加载的实体,但我宁愿只是摆脱懒惰loading / object-datacontext持久性。

所以我有4个选项

  1. 创建从L2S对象创建的域对象 - 大量工作和维护
  2. 创建我的L2S对象的衍生版本,打破了他的联系(http://www.codeproject.com/KB/linq/linq-to-sql-detach.aspx)
  3. 请改用LLBLGenPro。
  4. 呼吁堆栈溢出读者的智慧
  5. 我现在要4点。

    如何确保我的对象在我的仓库关闭后不会调用数据库?

    是的,我确实阅读过关于L2S和Repos的每个堆栈问题,但没有人回答这个问题。

1 个答案:

答案 0 :(得分:1)

有时, 对于加载实体的子项非常有用。您可以使用DataLoadOptions.LoadWith来执行此操作,它会告诉您的DataContext在加载父实体时自动加载实体的子项。

来自MSDN link above

的摘录
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Customer>(c => c.Orders);
db.LoadOptions = dlo

您还可以使用DataLoadOptions.AssociateWith进一步自定义自动加载的行为。