Linq2SQL,在Exception之后使用dataContext

时间:2012-06-20 13:10:03

标签: c# linq-to-sql exception datacontext

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

  • 编号
  • FirstName(不可为空)
  • LastName(不可为空)

在循环中:

  • 首先:我插入第一行......正常,
  • 第二:我尝试插入一个不正确的项目,Exception ...正常
  • 第三:我尝试插入第三行...... Exception(与第二行相同)但值正确。

dataContext之后使用相同的Exception是否有事可做?

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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

DataContext应始终是短暂的。您应该重新设计您的设计以实现这一目标。

您可以考虑以下几点:

  • 每笔交易使用上下文。通过这种方式,您可以以有意义的方式使上下文短暂存在。
  • 当您的交易失败时回滚。这包括使用新事务插入正确的项目。这意味着,你现在有了一个全新的不同背景。
  • 重复此过程,直到事务完成。
  • 同样,不要忘记在完成后结束上下文。这可以通过使用using语句轻松实现。

Remark from MSDN

  

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

     

通常,DataContext实例设计为持续一个“单位”   工作“但是你的应用程序定义了这个术语.DataContext是   重量轻,创建起来并不昂贵。典型的LINQ to SQL   应用程序在方法范围或作为a创建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);