В сценарии с несколькими арендаторами, предположим, у вас есть 2 таблицы: подписчиков & Контакт.
Вы хотите знать, кто является Первичным контактом для подписчика. Однако в таблице Contact также должна быть ссылка FKEY на SubscriberId для секционирования/для использования для ключа объединения и т. Д. (SQL Azure).
=======================================================================
Subscriber.sql
=======================================================================
-- One who has subscribed to Rhipheus
CREATE TABLE [rhipheus].[Subscriber]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Subscriber_Id] PRIMARY KEY CLUSTERED,
[ShortName] NVARCHAR(50) NOT NULL,
[LegalName] NVARCHAR(255) NOT NULL,
[SmallLogoPath] NVARCHAR(MAX) NOT NULL,
[LargeLogoPath] NVARCHAR(MAX) NOT NULL,
[PrimaryContactId] UNIQUEIDENTIFIER NULL REFERENCES [rhipheus].[Contact]([Id]),
)
====================================================================
Contact.sql
====================================================================
CREATE TABLE [rhipheus].[Contact]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Contact_Id] PRIMARY KEY CLUSTERED,
[SubscriberId] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [FKEY_Contact_SubscriberId_Subscriber_Id] REFERENCES [rhipheus].[Subscriber]([Id]),
[FirstName] NVARCHAR(50) NOT NULL,
[LastName] NVARCHAR(50) NOT NULL,
)
Это работало 2010 проект базы данных, поскольку она используется для стирают все ограничения на уровне столбцов и создавать их с помощью отдельных сценариев ALTER.
Способ, которым я решил это в VS.Net 2012, - объявить столбец внешнего ключа как NULLable и добавить внешние ключи для подписчика, используя отдельный оператор ALTER. Конечно, проект SQL Server в VS 2012 не позволил бы мне выполнить декларацию на уровне столбца, поскольку он не может определить, какую таблицу создать сначала (даже если HINT находится там, в форме объявления NULLable) ,
=======================================================================
Subscriber.sql
=======================================================================
-- One who has subscribed to Rhipheus
CREATE TABLE [rhipheus].[Subscriber]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Subscriber_Id] PRIMARY KEY CLUSTERED,
[ShortName] NVARCHAR(50) NOT NULL,
[LegalName] NVARCHAR(255) NOT NULL,
[SmallLogoPath] NVARCHAR(MAX) NOT NULL,
[LargeLogoPath] NVARCHAR(MAX) NOT NULL,
[PrimaryContactId] UNIQUEIDENTIFIER NULL
)
====================================================================
Contact.sql
====================================================================
CREATE TABLE [rhipheus].[Contact]
(
[Id] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID() CONSTRAINT [PKEY_Contact_Id] PRIMARY KEY CLUSTERED,
[SubscriberId] UNIQUEIDENTIFIER NOT NULL CONSTRAINT [FKEY_Contact_SubscriberId_Subscriber_Id] REFERENCES [rhipheus].[Subscriber]([Id]),
[FirstName] NVARCHAR(50) NOT NULL,
[LastName] NVARCHAR(50) NOT NULL
)
====================================================================
Subscriber.ForeignKeys.sql
====================================================================
ALTER TABLE [rhipheus].[Subscriber] ADD CONSTRAINT [FKEY_Subscriber_PrimaryContactId_Contact_Id] FOREIGN KEY([PrimaryContactId]) REFERENCES [rhipheus].[Contact]([Id])
GO
Вы уверены, что данные моделируются правильно? – munissor