日期:2014-05-20  浏览次数:20858 次

Linq中使用InsertOnSubmit()多条插入的问题[是否是微软bug?]
问题描述:
1、数据库“td”中有表“Products”(pid nchar(10) 主键),且已存在两条记录,如下:
  [pid] [pname]
  12354 omiga e32
  12356 omiga e32
2、使用Linq插入新纪录,代码如下:
 
C# code
    class Program
    {
        static void Main(string[] args)
        {
            ProductDataContext productDC = new ProductDataContext();
            Table<Products> productTable = productDC.GetTable<Products>();
            
            try
            {
                productTable.InsertOnSubmit(new Products() { pid = "12354", pname = "omiga e32" });//数据库存在主键为pid=‘12354’的记录
                productDC.SubmitChanges(ConflictMode.ContinueOnConflict);
            }
            catch
            {
                //第一次异常,可以理解
            }
            try
            {                
                productTable.InsertOnSubmit(new Products() { pid = "12360", pname = "omiga e32" });//数据库不存在该记录
                productTable.InsertOnSubmit(new Products() { pid = "12350", pname = "omiga e32" });//数据库不存在该记录
                productDC.SubmitChanges(ConflictMode.ContinueOnConflict);
            }
            catch
            {
                //这一次的异常,如何解释?(两条记录均未插入数据库中)
            }
        }
    }


3、上面代码中,第1条记录,数据库中存在,出现“违反了 PRIMARY KEY 约束 'PK_Products'。不能在对象 'dbo.Products' 中插入重复键。”异常,可解。但接下来,pid='12360'与pid='12350'两条记录均不能插入成功,且报同样的异常信息,不解。

请高人解释下。
难道是微软Linq的bug不成?

------解决方案--------------------
Try:

try
{
 ProductDataContext productDC1 = new ProductDataContext();
productDC1.GetTable<Products>().InsertOnSubmit(new Products() { pid = "12360", pname = "omiga e32" });
productDC1.GetTable<Products>().InsertOnSubmit(new Products() { pid = "12350", pname = "omiga e32" }); 
productDC1.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch
{

}
------解决方案--------------------
很平常,这就是滥用catch造成的。
------解决方案--------------------
探讨

引用:

你的重复记录已经在 productTable 里了,除非你Detach 移除它。


按照#1楼的提示,我解决了问题。对于你的Detach方案,我并没有很好的理解。如何去检测这个productTable表,在新插入的记录有重复的现象呢?请指点