我在实施Alexander Kuznetsov article中描述的技术时遇到了很多麻烦。基本上,本文描述了在一个表和备用表之间创建FK的方法,并且仍然保持对这些关系的完全约束。
这是亚历山大代码的一部分:
CREATE TABLE dbo.Vehicles(
ID INT NOT NULL,
[Type] VARCHAR(5) NOT NULL,
CONSTRAINT Vehicles_PK PRIMARY KEY(ID),
CONSTRAINT Vehicles_UNQ_ID_Type UNIQUE(ID, [Type]),
CONSTRAINT Vehicles_CHK_ValidTypes CHECK([Type] IN ('Car', 'Truck'))
)
CREATE TABLE dbo.Cars(ID INT NOT NULL,
[Type] AS CAST('Car' AS VARCHAR(5)) PERSISTED,
OtherData VARCHAR(10) NULL,
CONSTRAINT Cars_PK PRIMARY KEY(ID),
CONSTRAINT Cars_FK_Vehicles FOREIGN KEY(ID, [Type])
REFERENCES dbo.Vehicles(ID, [Type])
)
我终于在错误和确认错误后工作了。但是当我从新架构生成我的EF模型时,它缺少我的两个表之间的关系。
问题是,为了在两列上有一个FK,必须是这两列的索引或唯一约束。但是,在我的情况下,我还有另一个表格,其中FK指向基表中的一列(车辆,在亚历山大的代码中)。
由于表中不能有多个PK,这意味着我不能在两侧都有FK到PK。 PK可以是一列或两列,另一个FK需要引用非PK唯一约束。
不幸的是,实体框架只会在PK存在FK时为您创建关系。那就是问题所在。理解数据库设计的人能否比我在这里发现任何其他替代方案更好?
注意:我意识到有些人会看到明显的修复,只需修改模型即可手动添加其他关系。不幸的是,我们正在使用数据库项目,并且不断使用自动化系统从更新的数据库中重新生成项目和模型。所以手动步骤实际上并不实用。
答案 0 :(得分:1)
您不能拥有多个PK,但是您可以拥有多个唯一约束,并且在SQL Server中,您可以创建引用唯一约束(一个或多个列)的外键约束。这是一个大致看起来像你的模型的两个表的例子。
CREATE TABLE dbo.Vehicles
(
VehicleID INT PRIMARY KEY,
[Type] VARCHAR(5) NOT NULL UNIQUE,
CONSTRAINT u1 UNIQUE(VehicleID, [Type])
);
CREATE TABLE dbo.Cars
(
CarID INT PRIMARY KEY,
VehicleID INT NOT NULL
FOREIGN KEY REFERENCES dbo.Vehicles(VehicleID),
[Type] VARCHAR(5) NOT NULL
FOREIGN KEY REFERENCES dbo.Vehicles([Type]),
CONSTRAINT fk1 FOREIGN KEY (VehicleID, [Type])
REFERENCES dbo.Vehicles(VehicleID, [Type])
);
请注意,Cars有三个外键:一个指向车辆PK(VehicleID),一个指向车辆上的唯一约束([Type]),一个指向车辆上的多列唯一约束(VehicleID) ,[类型])。我意识到这不等于你想要做的事情但应该证明SQL Server至少能够做你想做的一切(我很难总结你的实际因为你不断交换Alex所做的事情,你想做但失败的事情,以及你成功完成的事情之间的概念。
您是说EF不会识别引用唯一约束的外键?如果是这样,是否会影响具有多个列的约束或所有唯一约束?如果是这种情况,那就太遗憾了,因为SQL Server当然支持它。这似乎是一个错误或故意遗漏(假设标准不严格允许FK对抗独特的约束)。我想知道Connect上是否有任何错误报告?
我不知道如何强制EF识别它,但我知道几乎所有使用数据库项目的人都会执行部署前或部署后的修改,这些可以相对自动化。