Предположим, у нас есть эти таблицы
Person( person_id, name, car_id )
CompanyCar( car_id, make, model, colour, plate )
Person.car_id должен быть внешним ключом для CompanyCar.car_id, но я хочу, чтобы Person.car_id был обнуляемым, поэтому при запуске sqlmetal для генерации linqto-sql DataContext, я должен получить
class Person{
int person_id,
string name,
int? car_id,
CompanyCar companyCar //object references may hold null
}
и , если присутствует , Person.car_id должен существовать в CompanyCar.
Согласно прочитанной мною документации MSDN, это не должно быть возможным, но когда мы попробовали, это сработало.Мало кто, кажется, пишет или спрашивает об этом типе отношений в Интернете.
Могу ли я доверять принудительному применению этого внешнего ключа, хотя он и является необязательным?
ОБНОВЛЕНИЕ: Вот что генерирует SMSS, когда я запросил скрипт CREATE.Обратите внимание, что FK создан как NOCHECK , но он выдает жалобу, если я ввожу CarID (например, 9999), которого, как мне известно, в таблице CompanyCar нет.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Person](
[PersonID] [int] NOT NULL,
[Name] [varchar](100) NOT NULL,
[CarID] [int] NULL
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[PersonID] ASC
)WITH FILLFACTOR = 92 ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Person] WITH NOCHECK ADD CONSTRAINT [FK_Person_CompanyCar] FOREIGN KEY([CarID])
REFERENCES [dbo].[CompanyCar] ([CarID])
GO
несоответствия имен, работа требует именования примеров)