LINQ to SQL запрос вставки не работает из проекта модульного теста - PullRequest
0 голосов
/ 12 июня 2009

У меня странное поведение в Linq to Sql ...

У меня есть простой родитель | дочерняя (один ко многим) объектная модель. В моем приложении я создаю родительский объект и заполняю все дочерние элементы в памяти, а затем вызываю метод add моего репозитория, чтобы вставить обоих родителей вместе с его дочерними элементами.

Теперь из моего приложения (winform) все работает правильно, как и ожидалось, но я настроил небольшой метод в своем проекте модульного теста, просто чтобы выполнить метод добавления репозитория (я знаю, что это не модульный тест, так как я нажимаю базы данных) и из метода test возвращает исключение «оператор INSERT, конфликтующий с ограничением FOREIGN KEY».

Я проследил как вызов, так и их получение, правильно созданный родительский объект (т. Е. У родителя есть список дочерних элементов, а у каждого дочернего элемента есть ссылка на родительский идентификатор и родительский объект).

Мой метод вставки выглядит следующим образом:

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 Ответ

0 голосов
/ 12 июня 2009

Не берите в голову ... Я делал глупую ошибку в своем тесте и неправильно связывал второго ребенка с его родительским StartList

...