Comment append une key primaire (Surrogate) d'une table dans une key étrangère d'une autre table?

J'essaye d'append ma table CustId (key primaire) des clients dans CustID (key étrangère) de CustomerAddress Table. Mais je suis incapable d'append la key étrangère automatiquement. que devrais-je faire. Voici mon schéma (je l'ai copié depuis mon instance SQL Server)

CREATE TABLE [dbo].[Customers] ( [CustId] INT IDENTITY (1, 1) NOT NULL, [FirstName] NVARCHAR (50) NOT NULL, [MiddleName] NVARCHAR (50) NULL, [LastName] NVARCHAR (50) NOT NULL, [Salutation] NVARCHAR (10) NULL, [Position] NVARCHAR (50) NULL, [OrganizationType] NVARCHAR (50) NULL, [PhoneNumber] NVARCHAR (50) NOT NULL, [Ext] NCHAR (10) NULL, [FaxNumber] NVARCHAR (50) NULL, [CellNumber] NVARCHAR (50) NULL, [EmailAddress] NVARCHAR (50) NOT NULL, [EmailPermission] NCHAR (10) NOT NULL, [Password] NVARCHAR (50) NOT NULL, PRIMARY KEY CLUSTERED ([CustId] ASC) ); CREATE TABLE [dbo].[CustomerAddress] ( [AddressID] INT NOT NULL IDENTITY (1, 1), [CustID] INT, [OrganizationName] NVARCHAR (50) NOT NULL, [Division] NVARCHAR (50) NULL, [Department] NVARCHAR (50) NOT NULL, [BuildingRoom] NVARCHAR (50) NULL, [Street] NVARCHAR (50) NULL, [City] NVARCHAR (50) NULL, [POBox] NVARCHAR (50) NULL, [Province] NVARCHAR (50) NULL, [PostalCode] NCHAR (10) NOT NULL, [Country] NVARCHAR (30) NOT NULL, [AddressType] CHAR (10) NOT NULL, PRIMARY KEY CLUSTERED ([AddressID]), CONSTRAINT [FK_CustID] FOREIGN KEY ([CustID]) REFERENCES [dbo].[Customers] ([CustId]) ); 

Code C # pour l'insertion de données:

 public int AddCustomerDeliveryAddress(CustomerAddressBLL NewCustomerDeliveryAddressBLL) { ssortingng sql = ssortingng.Format(@"Insert into CustomerAddress (OrganizationName,Division,Department,BuildingRoom,Street,City,POBox,Province,PostalCode,Country,AddressType) Values(@OrganizationName,@Division,@Department,@BuildingRoom,@Street,@City,@POBox,@Province,@PostalCode,@Country,@AddressType)"); db.AddParameter("@OrganizationName", NewCustomerDeliveryAddressBLL.Organization); db.AddParameter("@Division", NewCustomerDeliveryAddressBLL.Division); db.AddParameter("@Department", NewCustomerDeliveryAddressBLL.Department); db.AddParameter("@BuildingRoom", NewCustomerDeliveryAddressBLL.BuildingRoom); db.AddParameter("@Street", NewCustomerDeliveryAddressBLL.Street); db.AddParameter("@City", NewCustomerDeliveryAddressBLL.City); db.AddParameter("@POBox", NewCustomerDeliveryAddressBLL.PoBox); db.AddParameter("@Province", NewCustomerDeliveryAddressBLL.Province); db.AddParameter("@PostalCode", NewCustomerDeliveryAddressBLL.PostalCode); db.AddParameter("@Country", NewCustomerDeliveryAddressBLL.Country); db.AddParameter("@AddressType", NewCustomerDeliveryAddressBLL.AddressType); return db.ExecuteNonQuery(sql); } 

Si vous le faites en T-SQL "pur", vous devez utiliser du code comme ceci:

 -- declare variable for your identity DECLARE @NewCustId INT; -- insert into your Customers table INSERT INTO dbo.Customers([FirstName], [MiddleName], [LastName], ......) VALUES ('John', 'Robert', 'Doe', ........); -- get the newly inserted Identity value SET @NewCustId = SCOPE_IDENTITY(); -- insert into CustomerAddress table INSERT INTO dbo.CustomerAddress ([CustID], [OrganizationName], [Division], ......) VALUES(@NewCustId, 'Orgname', 'Division', .....) 

Mise à jour: OK, c'est le code C # – vous devez le changer pour inclure SELECT SCOPE_IDENTITY() à la fin:

 ssortingng sql = ssortingng.Format(@"INSERT INTO dbo.CustomerAddress (OrganizationName, Division, Department, BuildingRoom, Street, City, POBox, Province, PostalCode, Country, AddressType) VALUES (@OrganizationName, @Division, @Department, @BuildingRoom, @Street, @City, @POBox, @Province, @PostalCode, @Country, @AddressType); SELECT SCOPE_IDENTITY();"); 

et l'utilisation de cet appel:

 int newCustId = (int)db.ExecuteScalar(sql); 

donc vous récupérez maintenant le NewCustID de votre appel INSERT – utilisez maintenant cette valeur dans la deuxième insertion, vous devez insert vos données dans CustomerAddress