none
Linq 存储主从表结构实体时,居然插入了多条相同记录?是否Bug!!!! RRS feed

  • 问题

  • 最近使用LinqToSql做一个项目,保存一个页面提交的数据,数据量比较多,
    设计表时用了主从表结构,类似如下, 主表table1主键 t1id  是从表table2的外键,
    table1(
      t1id int identity,
      CreateDate DateTime,
      tfield1 nvarchar(50),
      tfield11 nvarchar(50),
    .....)
    table2(
       t2ID int identity,
       t1id int ,
       tfield2 nvarchar(50),
       tfield22 nvarchar(50),
    ....)

    具体如下面例子结构保存
    using (Linq.TestDbDataContext db = new Test.Linq.TestDbDataContext())
    {
        Linq.table1 addtable1 = new Test.Linq.table1();
                                addtable1.tfield1 = "aaaa";
                                addtable1.tfield11 = "aaaa";
                                addtable1.DateTime = DateTime.Now;
                      foreach (DataListItem dli in dlItem.Items)
                      {
                            Linq.table2 addtable2 = new Test.Linq.table2();
                             addtable2.tfield2 = "bbbb";
                             addtable2.tfield22 = "bbbb";
                             addtable1.table2.add(addtable2);
                      }
           db.table1.InsertOnSubmit(addtable1);
           db.SubmitChanges();
    }

    当然实际代码比这个例子赋值更多的字段,赋值过程中也有更多的判断,但是都是在Using(  )的范围里面,也就是在同一个Sql事务里面。
    当项目实施了几个月之后,忽然发现在数据库里面有很多相同的头表记录。除了主键不一样,其他都一样的记录,连CreateDate都是相同的时间,
    但是子表只是有第一条主表的外键。并没有同时插入相同的子表,最多的时候会有5条相同的主表。

    而且不是经常发生,因为天天都有数据上来,但是一个月下来,只是偶尔有2,3天有某条记录发生这样的情况,所以可以排除代码逻辑问题。

    请问,到底Linq发生什么事情哦!!!!!!!!!!!!!!!

    开发运行环境( VS2008+Ajax +Linq ) 数据库 Sql2000 运行在Windows2003 SP2

    2009年10月22日 13:40

答案

  • addtable1.table2.add(addtable2);
    这条代码好像有点问题~有add方法吗?我觉得可以试试写成
    addtable2.table1=addtable1;
    另外~如果要监视Linq to SQL对数据库做了哪些操作可以用SQL Server Profiler
    2009年10月31日 16:30
    版主
  • addtable2.table1=addtable1;
    只表明addtable2这条记录的外键是关联到addtable1这条记录的~还是应该先有主表记录的~
    2009年11月4日 4:58
    版主

全部回复

  • 猜测是多次同时提交造成
    你提供代码太少了 看不出什么原因

    2009年10月22日 14:23
  • 如果是多次提交,不可能CreateDate 是相同的,我看过里面多条相同的记录不单1秒不差,连毫秒都不差,显然是同时提交的,而不是多次提交!!!!!!

    2009年10月25日 13:11
  • 你用事务控制下试试看
    2009年10月25日 13:49
  • Linq 缺省不是有隐式事务吗?
    using (Linq.TestDbDataContext db = new Test.Linq.TestDbDataContext())
    {
       
    }
    2009年10月25日 14:00
  • 在设计linq上考虑性能问题 一般不会增加隐私事务
    2009年10月25日 14:12
  •  隐式事务
          当您调用 SubmitChanges 时,LINQ to SQL 会检查此调用是否在 Transaction 的作用域内或者 Transaction 属性 (IDbTransaction) 是否设置为由用户启动的本地事务。如果这两个事务均未找到,则 LINQ to SQL 启动本地事务 (IDbTransaction),并使用此事务执行所生成的 SQL 命令。当所有 SQL 命令均已成功执行完毕时,LINQ to SQL 提交本地事务并返回。

    上面这句技术说明是我从微软的Dsdn技术文档查到的,http://msdn.microsoft.com/zh-cn/library/bb386995.aspx
    说是有隐式事务。

    而且现在是插多了相同的主表记录,感觉不象是事务的问题,如果没事务控制而出的问题,应该插少了子表,而不应该插多了主表记录呀,而且每条记录连CreateDate都是一样的?

    2009年10月25日 14:50
  • 没有遇到这个情况 不好意思
    2009年10月25日 15:22
  • addtable1.table2.add(addtable2);
    这条代码好像有点问题~有add方法吗?我觉得可以试试写成
    addtable2.table1=addtable1;
    另外~如果要监视Linq to SQL对数据库做了哪些操作可以用SQL Server Profiler
    2009年10月31日 16:30
    版主
  • table2 是从表, 本身也可以插入数据,当然有add的方法;
    而且已经是可以执行的项目了,当然是可以的。

    因为Table2是从表,会有多条记录,你这种方式 addtable2.table1=addtable1是不是更有问题,你的意思是先插从表再插主表吗,记得从表的ID是从主表来的哦?

    因为是有些时候出现多插了记录的情况,大概是千分之一的几率,不可能用SQL Server Profiler监视,不现实。
    而且监视到忽然有多余的插入语句,哪也没意义,代码还是哪些代码。

    2009年11月4日 0:36
  • addtable2.table1=addtable1;
    只表明addtable2这条记录的外键是关联到addtable1这条记录的~还是应该先有主表记录的~
    2009年11月4日 4:58
    版主