4

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

  • ID
  • 名字(不可为空)
  • 姓氏(不可为空)

在循环 :

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

在 a 之后有什么办法可以使用相同dataContextException吗?

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

1 回答 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);
于 2012-06-20T13:40:18.327 回答