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