Linq2SQL,异常后如何使用dataContext

4
这里有一小段代码用于测试和解释问题。我有一个名为Person的表,有3个字段:

  • Id
  • FirstName(不能为空)
  • LastName(不能为空)

在循环中:

  • 首先:我插入第一行……正常
  • 其次:我尝试插入不正确的项,出现异常……正常
  • 第三:我尝试插入第三行……异常(与第二个相同),但是这些值是正确的。

是否有什么方法可以在异常后继续使用相同的dataContext

public class MyTestClass
{
    private readonly DataModelDataContext _dataContext;

    public MyTestClass()
    {
        _dataContext = new DataModelDataContext();
    }

    public void InsertList()
    {
        List<Person> liste = new List<Person>();
        liste.Add(new Person { FirstName = "AAA", LastName = "BBBB" });
        liste.Add(new Person { FirstName = string.Empty, LastName = null });
        liste.Add(new Person { FirstName = "CCC", LastName = "DDD" });

        foreach (var item in liste)
        {
            try
            {
                _dataContext.Persons.InsertOnSubmit(item);
                _dataContext.SubmitChanges();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

可能是Linq DataContext doesn't recover after a caught exception?的重复问题。 - Justin Pihony
你检查过第二个人是否仍在_dataContext.Persons等待插入的列表中了吗? - Stephan
1个回答

3

DataContext应该是短暂的。您应该重新设计以实现这一点。

您可以考虑以下几点:

  • 在每个事务中使用上下文。这样,您可以有意义地使上下文短暂。
  • 当您的事务失败时回滚。这包括使用新事务插入正确的项。也就是说,您现在有一个新鲜的不同的上下文。
  • 重复这个过程直到事务完成。
  • 再次强调,在完成操作后不要忘记结束上下文。通过使用using语句可以轻松实现这一点。

MSDN的备注

DataContext是映射到数据库连接的所有实体的来源。它跟踪您对所有检索到的实体所做的更改,并维护一个“标识缓存”,保证多次检索到的实体使用相同的对象实例表示。

总的来说,DataContext实例旨在持续进行一次“工作单元”,但是您的应用程序定义它的方式。DataContext非常轻量级且创建成本不高。典型的LINQ to SQL应用程序在方法范围内或作为表示相关数据库操作的逻辑集合的短期生命周期类的成员创建DataContext实例。


如果需要时间来重新设计您的应用,可以暂时这样做:

    public void InsertList(List<Person> people)
    {
        foreach (var person in people)
        {
            DoInsert(person); 
            // You can use the returned flag and implement the logic if desired.
            // Or let the loop move on its ways.
        }
    }

    public bool DoInsert(Person person)
    {
        try
        {
            using (DataModelDataContext dataContext = new DataModelDataContext())
            {
                dataContext.Persons.InsertOnSubmit(person);
                dataContext.SubmitChanges();
            }
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
    }

这是如何调用InserList方法的:

    List<Person> liste = new List<Person>();
    liste.Add(new Person { FirstName = "AAA", LastName = "BBBB" });
    liste.Add(new Person { FirstName = string.Empty, LastName = null });
    liste.Add(new Person { FirstName = "CCC", LastName = "DDD" });

    InsertList(liste);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接