代码之家  ›  专栏  ›  技术社区  ›  Jaime

LINQ to SQL插入查询无法从单元测试项目工作

  •  0
  • Jaime  · 技术社区  · 15 年前

    我在Linq to SQL中有一个奇怪的行为…

    我有一个简单的父子(一对多)对象模型。在我的应用程序中,我创建父对象并将子对象全部填充到内存中,然后调用存储库的add方法来插入父对象及其子对象。

    现在,从我的应用程序(winform)来看,一切都按预期正常工作,但是我在单元测试项目中设置了一个小方法,只是为了练习repositor的add方法(我知道,因为我正在访问数据库,所以不是单元测试),从测试方法来看,它返回一个“insert语句与foreign key约束冲突”异常。

    我已经跟踪了调用及其接收正确构造的父对象(即父对象有一个子对象列表,每个子对象都引用父ID和父对象)。

    我的插入方法如下:

    public void AddStartList(StartList list)
    {
        using (MyDataContext context = new MyDataContext())
        {
            context.Log = Console.Out;
            context.StartLists.InsertOnSubmit(list);
            context.SubmitChanges();
        }
    }
    

    Linq的输出日志看起来都一样,除了第二个子项(在测试方法的情况下),它不能将parentID与子项关联。

    工程的输出日志

    INSERT INTO [dbo].[StartLists]([Name], [TargetControl], [FirstCarDue], [Status])
    VALUES (@p0, @p1, @p2, @p3)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    -- @p0: Input VarChar (Size = 4; Prec = 0; Scale = 0) [Test]
    -- @p1: Input Char (Size = 10; Prec = 0; Scale = 0) [CH0]
    -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1/1/2009 8:00:00 AM]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
    -- Context: SqlProvider(Sql2005) Model: MappedMetaModel Build: 3.5.30729.1
    
    INSERT INTO [dbo].[StartListEntries]([StartListId], [CarNo], [StartTime], [Order], [Notas])
    VALUES (@p0, @p1, @p2, @p3, @p4)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [18]
    -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
    -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1/1/2009 8:00:00 AM]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
    -- @p4: Input VarChar (Size = 0; Prec = 0; Scale = 0) [Null]
    -- Context: SqlProvider(Sql2005) Model: MappedMetaModel Build: 3.5.30729.1
    
    INSERT INTO [dbo].[StartListEntries]([StartListId], [CarNo], [StartTime], [Order], [Notas])
    VALUES (@p0, @p1, @p2, @p3, @p4)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [18]
    -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [2]
    -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1/1/2009 8:01:00 AM]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [2]
    -- @p4: Input VarChar (Size = 0; Prec = 0; Scale = 0) [Null]
    -- Context: SqlProvider(Sql2005) Model: MappedMetaModel Build: 3.5.30729.1
    

    不起作用的是:

    INSERT INTO [dbo].[StartLists]([Name], [TargetControl], [FirstCarDue], [Status])
    VALUES (@p0, @p1, @p2, @p3)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    -- @p0: Input VarChar (Size = 4; Prec = 0; Scale = 0) [Test]
    -- @p1: Input Char (Size = 10; Prec = 0; Scale = 0) [CH0]
    -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1/1/2009 8:00:00 AM]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
    -- Context: SqlProvider(Sql2005) Model: MappedMetaModel Build: 3.5.30729.1
    
    INSERT INTO [dbo].[StartListEntries]([StartListId], [CarNo], [StartTime], [Order], [Notas])
    VALUES (@p0, @p1, @p2, @p3, @p4)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [19]
    -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
    -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1/1/2009 8:00:00 AM]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
    -- @p4: Input VarChar (Size = 0; Prec = 0; Scale = 0) [Null]
    -- Context: SqlProvider(Sql2005) Model: MappedMetaModel Build: 3.5.30729.1
    
    INSERT INTO [dbo].[StartListEntries]([StartListId], [CarNo], [StartTime], [Order], [Notas])
    VALUES (@p0, @p1, @p2, @p3, @p4)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [0]   **<<----- THIS ONE SHOULD BE 19!!!**
    -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [2]
    -- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1/1/2009 8:01:00 AM]
    -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [2]
    -- @p4: Input VarChar (Size = 0; Prec = 0; Scale = 0) [Null]
    -- Context: SqlProvider(Sql2005) Model: MappedMetaModel Build: 3.5.30729.1
    

    有什么想法吗?

    PS.对不起,这封长信

    1 回复  |  直到 15 年前
        1
  •  0
  •   Jaime    15 年前

    不要介意。。。我在考试中犯了一个愚蠢的错误,没有把第二个孩子正确地和父母联系起来。