0

我在 Linq to Sql 中有一个奇怪的行为......

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

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

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

我的插入方法如下所示:

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

并且来自 linq 的输出日志看起来都一样,除了第二个孩子(在测试方法的情况下)它不能将 parentId 与孩子相关联

WORKS 的输出日志是

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。对不起,很长的帖子

4

1 回答 1

0

没关系...我在测试中犯了一个愚蠢的错误,并且没有将第二个孩子正确地关联到它的父级 StartList

于 2009-06-12T04:24:00.273 回答