如何锁定DataClass

时间:2012-09-04 19:51:40

标签: c# linq-to-sql

我正在使用Linq to Sql连接与数据库协作,我的Windows窗体应用程序可以与多个线程协同工作,而这与DataClass不兼容。 我修改了支持MultipleActiveResultSets的连接,我收到此错误"An item with the same key has already been added."我搜索了这个问题,只得到了2个答案:

  • 仅在主线程中使用DataClass;
  • 检索表时锁定DataClass;

我想lock DataClass并且不知道在哪里锁定它,我确信有人在多线程中成功使用了Linq to Sql。

1 个答案:

答案 0 :(得分:2)

要扩展我在评论中所说的内容,并回答你的问题 - 我会将所有访问视为一个工作单元,例如(在某些数据访问类中):

public Order GetOrder(int id) {
    // ctx could also be instantiated via an IoC/DI framework, etc
    using(var ctx = CreateDataContext()) {
        return ctx.Orders.SingleOrDefault(x => x.Id == id);
    }
}
public void AddOrder(Order order) {
    if(order == null) throw new ArgumentNullException("order");
    // ctx could also be instantiated via an IoC/DI framework, etc
    using(var ctx = CreateDataContext()) {
        ctx.Orders.InsertOnSubmit(order);
        ctx.SubmitChanges();
    }
}

等。关键点:数据上下文不会无限期地保持打开状态并被竞争线程重用。