代码之家  ›  专栏  ›  技术社区  ›  Sundararajan S

Linq to SQL-错误处理

  •  4
  • Sundararajan S  · 技术社区  · 15 年前

    我有一个LINQ to SQL语句,它在数据库中插入记录。如果存在重复项,它将引发主键冲突。

    在这种情况发生后,每当我尝试执行任何其他语句时,它都会重复显示此错误。这是一个事务未关闭的问题吗?另外,如何在Linq to SQL中以更可靠的方式处理事务

    4 回复  |  直到 15 年前
        1
  •  4
  •   Amy B    15 年前

    每个DataContext实例跟踪它所看到的映射类的实例。当你说: myDataContext.InsertOnSubmit(myCustomer); 您正在向此DataContext注册客户实例。稍后,当你说 myDataContext.SubmitChanges(); ,DataContext尝试执行它正在跟踪的所有更改。

    • 如果这些更改失败-DataContext不会停止跟踪这些更改,并将在每次调用SubmitChanges时尝试进行更改。

    为了使DataContext不跟踪它无法插入的记录,应放弃此实例并新建另一个实例。

        2
  •  1
  •   Neil T.    15 年前

    如果您的主键字段是标识字段, 将其插入数据库时填充它。例如,给定一个具有以下结构的客户表:

    Customer
    ========
    Customer_ID (PK, identity)
    Last_Name (varchar)
    First_Name (varchar)
    Middle_Initial (char)
    

    这是可能的:

    public int CreateCustomer(string lastName, string firstName, string middleInitial) 
    {
        using (DataContext dc = new DataContext())
        {
            Customer customer = new Customer();
    
            customer.Last_Name = lastName;
            customer.First_Name = firstName;
            customer.Middle_Initial = middleInitial;
            dc.Customers.InsertOnSubmit(customer);
            dc.SubmitChanges();
    
            return customer.Customer_ID;
        }   
    }
    

    出现错误的最可能原因是,在创建实体对象的DataContext被破坏后,您正试图访问该实体对象。使用上面的示例,这将产生一个与您可能收到的错误类似的错误:

    public int CreateCustomer(string lastName, string firstName, string middleInitial) 
    {
        using (DataContext dc = new DataContext())
        {
            Customer customer = new Customer();
    
            customer.Last_Name = lastName;
            customer.First_Name = firstName;
            customer.Middle_Initial = middleInitial;
            dc.Customers.InsertOnSubmit(customer);
            dc.SubmitChanges();
        }   
    
        return customer.Customer_ID;   // <<-- Error occurs here
    }
    

    发生错误的原因是由于LINQ引擎的内置更改跟踪。创建DataContext时,在该DataContext中创建的任何实体对象都通过实体对象中的引用绑定到该DataContext。一旦DataContext超出范围,引用就不再有效,并且实体对象的内容对Linq引擎不再可靠。

    就事务处理而言,事务是在创建DataContext时创建的。什么时候? SubmitChanges 调用时,无论涉及多少实体/表,所有更改都将在DataContext事务的上下文中执行。

        3
  •  0
  •   Eric Petroelje    15 年前

    你用的是相同的吗 DataContext ?如果是这样,请不要这样做-为每个逻辑操作创建一个新的DataContext并使用 TransactionScope 管理交易

        4
  •  -1
  •   Coppermill    15 年前

    为什么不在保存记录之前检查一个重复的记录?

    抛出异常非常昂贵。