0

Есть две таблицы.Внутренняя вставка внешнего ключа

Customer    Contact 
_______________________________________ 
CustomerId *--> CustomerId 
CustomerName   ContactId 
...     ContactFirstName 
         ... 

One customer can have many contacts 

Хранимые процедуры

CREATE PROCEDURE dbo.InsertCustomers 
(
    @CustomerId int, 
    @CustomerName nvarchar(50) 
) 
AS 
SET NOCOUNT OFF; 
INSERT INTO [dbo].[Customers] ([CustomerName]) VALUES (@CustomerName); 

SELECT CustomerId, CustomerName FROM Customers WHERE (CustomerId = @CustomerId) 

Второй один:

CREATE PROCEDURE dbo.InsertContacts 
(
    @CustomerId int, 
    @ContactFirstName nvarchar(20) 
) 
AS 
SET NOCOUNT OFF; 
INSERT INTO [dbo].[Contacts] ([CustomerId], [ContactFirstName]) VALUES (@CustomerId, @ContactFirstName); 

SELECT ContactId, CustomerId, ContactFirstName FROM Contacts WHERE (CustomerId = @CustomerId) 

Использование Linq к SQL я пытаюсь вставить данные из WinForms в базу данных. В конструкторе я установил поведение вставки в мою хранимую процедуру для обоего, класса Customer и класс Contact, а на

_context.SubmitChanges(); получили ошибку

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_CustomerContact". The conflict occurred in database "test", table "dbo.Customers", column 'CustomerId'.The statement has been terminated.

Должен ли я изменить мою хранимую процедуру или обработок, что в коде ?

Как установить Contacts.CustomerId при вставке дочерних строк.

+0

Почему вы вставив запись с 'CustomerName' затем выбрать строку с' CustomerId'? Вы можете найти @@ IDENTITY (http://technet.microsoft.com/en-us/library/ms187342.aspx) или SCOPE_IDENTITY() (http://technet.microsoft.com/en-us/library /ms190315.aspx). Предполагая, что таблица 'Customers' имеет первичный ключ auto-inc. –

+0

Я создал эту хранимую процедуру из примера хранимой процедуры Northwind. Можете ли вы объяснить мне, что является проблемой при выборе CustomerId после вставки? Кроме того, должен ли я иметь одну хранимую процедуру для использования @@ IDENTITY, но что делать, если при сохранении мне нужно вставить много дочерних строк в разные дочерние таблицы, такие как контакты, проекты и т. Д. – Carlo

+0

Процедура 'InsertCustomers'. Первый оператор выглядит как первичный ключ auto-inc, но вы передаете customerid как параметр. Я думаю, вы должны определить customerid как выходной параметр. 'SET @CustomerId = @@ IDENTITY' –

ответ

0

Вместо использования хранимых процедур для вставки данных вы можете использовать простой метод Linq для вставки данных.

DataClasseseMyDataContext db = new DataClasseseMyDataContext(conString); 

db.Customers.InsertOnSubmit(Customers); 
tblSupplierPO.tblInvSupplierPOPIDetails.Add(Contacts); 

db.SubmitChanges(); 

Вы должны создать отношения между таблицами и добавить их в DBML

+0

И как я могу узнать, нужно ли мне обновлять или вставлять строки. Как добавить несколько дочерних строк. Например, мне нужно одновременно вставить одного клиента с тремя контактами. – Carlo

+0

у вас могут быть разные методы для вставки и обновления. Чтобы вставить несколько деталей, вы можете иметь список, содержащий Контактные объекты. В этом списке вы можете вставить несколько деталей или вы можете вставить все данные в. 'Список ContactList = ВАШ СПИСОК ОБЪЕКТОВ КОНТАКТ; foreach (контакт c в контактном листе) { tblSupplierPO.tblInvSupplierPOPIDetails.Add (c); } – tarzanbappa

Смежные вопросы