Entity Framework 不会从数据库中检测外键
Entity Framework won't detect foreign key from database
我有两个 tables - Appointment
和 User
。约会可以链接到两个不同的用户 - 学生和教职员工。 Appointment
table 包含两个外键:StaffUsername
和 ExternalID
。 User
table 中的这些引用列名为 Username
(User
table 的 PK)和 ExternalID
(一个 UNIQUE 索引)。以下是 table 定义:
CREATE TABLE [dbo].[Appointment]
(
[ID] INT NOT NULL IDENTITY(1,1),
[AppointmentTypeID] INT NOT NULL,
[StartTime] DATETIME NOT NULL,
[EndTime] DATETIME NOT NULL,
[AppointmentSlotID] INT NULL,
[StaffUsername] NVARCHAR(200) NOT NULL,
[ExternalID] NVARCHAR(10) NULL,
[BookedBy] NVARCHAR(200) NOT NULL,
[BookedTimestamp] DATETIME NOT NULL,
[ReminderEmailSentTimestamp] DATETIME NULL,
[CancelledBy] NVARCHAR(200) NULL,
[CancelledTimestamp] DATETIME NULL,
[StudentDidNotAttend] BIT NULL,
[LastModifiedTimestamp] DATETIME NOT NULL,
[LastModifiedBy] NVARCHAR(200) NOT NULL,
CONSTRAINT [PK_Appointment] PRIMARY KEY CLUSTERED ([ID] ASC),
CONSTRAINT [FK_Appointment_AppointmentType] FOREIGN KEY ([AppointmentTypeID]) REFERENCES [dbo].[AppointmentType]([ID]),
CONSTRAINT [FK_Appointment_AppointmentSlot] FOREIGN KEY ([AppointmentSlotID]) REFERENCES [dbo].[AppointmentSlot]([ID]),
CONSTRAINT [FK_Appointment_User_StaffUsername] FOREIGN KEY ([StaffUsername]) REFERENCES [dbo].[User]([Username]),
CONSTRAINT [FK_Appointment_User_ExternalID] FOREIGN KEY ([ExternalID]) REFERENCES [dbo].[User]([ExternalID])
)
CREATE TABLE [dbo].[User]
(
[Username] NVARCHAR(200) NOT NULL,
[FirstName] NVARCHAR(200) NULL,
[LastName] NVARCHAR(200) NULL,
[EmailAddress] NVARCHAR(200) NULL,
[IsStaff] BIT NOT NULL DEFAULT 0,
[ExternalID] NVARCHAR(10) NOT NULL,
[LastLogin] DATETIME NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ([Username] ASC),
CONSTRAINT [UQ_ExternalID] UNIQUE ([ExternalID])
)
不幸的是,当我在 EDMX 模型设计器中使用 从数据库更新模型 选项时,它不会选取 ExternalID
列上的外键。它仍然看起来像这样(以绿色突出显示的是与正确建模的关系相关的属性,以黄色突出显示的是应该与第二个关系相关但被忽略的属性):
我从经验中知道 EDMX 设计器有时会很古怪,尤其是在检测对象的变化时,所以我尝试了所有常用的技巧。我在 Web.config
中检查过我的连接字符串指向正确的数据库。我已经完全删除了设计器中的 Appointment
和 User
table,并再次删除了 运行 Update 命令。我也尝试过在删除和更新之间保存并重新启动 Visual Studio。
为了检查数据库中的关系是否正确,我在 SSMS 中创建了一个数据库图表,它正确显示了麻烦的关系:
我还创建了一个全新的项目并添加了一个新的实体数据模型,该模型指向具有相同凭据的同一数据库,以防万一问题与我正在更新现有模型这一事实有关,但没有骰子。即使在新项目中,也未检测到关系。
我还尝试手动创建导航 属性,但是正如您从该屏幕截图中看到的那样,我需要 select 的外键在下拉列表中不可用:
我不知道这个问题是否与 ExternalID
列不是 User
table 的主键或者它的 NVARCHAR(10)
数据类型。老实说,我不知道。
关于为什么没有检测到这个外键有什么建议吗?我该如何解决?我的项目以 .NET Framework 4.6 为目标,我使用的是 EF6。显然我首先使用数据库。
在 EF6 中,实体只有一个键,因此所有导航属性都必须使用引用相同键的外键。 EF Core 支持 Alternate Keys, and supports a Database-First workflow with Reverse Engineering.
我有两个 tables - Appointment
和 User
。约会可以链接到两个不同的用户 - 学生和教职员工。 Appointment
table 包含两个外键:StaffUsername
和 ExternalID
。 User
table 中的这些引用列名为 Username
(User
table 的 PK)和 ExternalID
(一个 UNIQUE 索引)。以下是 table 定义:
CREATE TABLE [dbo].[Appointment]
(
[ID] INT NOT NULL IDENTITY(1,1),
[AppointmentTypeID] INT NOT NULL,
[StartTime] DATETIME NOT NULL,
[EndTime] DATETIME NOT NULL,
[AppointmentSlotID] INT NULL,
[StaffUsername] NVARCHAR(200) NOT NULL,
[ExternalID] NVARCHAR(10) NULL,
[BookedBy] NVARCHAR(200) NOT NULL,
[BookedTimestamp] DATETIME NOT NULL,
[ReminderEmailSentTimestamp] DATETIME NULL,
[CancelledBy] NVARCHAR(200) NULL,
[CancelledTimestamp] DATETIME NULL,
[StudentDidNotAttend] BIT NULL,
[LastModifiedTimestamp] DATETIME NOT NULL,
[LastModifiedBy] NVARCHAR(200) NOT NULL,
CONSTRAINT [PK_Appointment] PRIMARY KEY CLUSTERED ([ID] ASC),
CONSTRAINT [FK_Appointment_AppointmentType] FOREIGN KEY ([AppointmentTypeID]) REFERENCES [dbo].[AppointmentType]([ID]),
CONSTRAINT [FK_Appointment_AppointmentSlot] FOREIGN KEY ([AppointmentSlotID]) REFERENCES [dbo].[AppointmentSlot]([ID]),
CONSTRAINT [FK_Appointment_User_StaffUsername] FOREIGN KEY ([StaffUsername]) REFERENCES [dbo].[User]([Username]),
CONSTRAINT [FK_Appointment_User_ExternalID] FOREIGN KEY ([ExternalID]) REFERENCES [dbo].[User]([ExternalID])
)
CREATE TABLE [dbo].[User]
(
[Username] NVARCHAR(200) NOT NULL,
[FirstName] NVARCHAR(200) NULL,
[LastName] NVARCHAR(200) NULL,
[EmailAddress] NVARCHAR(200) NULL,
[IsStaff] BIT NOT NULL DEFAULT 0,
[ExternalID] NVARCHAR(10) NOT NULL,
[LastLogin] DATETIME NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ([Username] ASC),
CONSTRAINT [UQ_ExternalID] UNIQUE ([ExternalID])
)
不幸的是,当我在 EDMX 模型设计器中使用 从数据库更新模型 选项时,它不会选取 ExternalID
列上的外键。它仍然看起来像这样(以绿色突出显示的是与正确建模的关系相关的属性,以黄色突出显示的是应该与第二个关系相关但被忽略的属性):
我从经验中知道 EDMX 设计器有时会很古怪,尤其是在检测对象的变化时,所以我尝试了所有常用的技巧。我在 Web.config
中检查过我的连接字符串指向正确的数据库。我已经完全删除了设计器中的 Appointment
和 User
table,并再次删除了 运行 Update 命令。我也尝试过在删除和更新之间保存并重新启动 Visual Studio。
为了检查数据库中的关系是否正确,我在 SSMS 中创建了一个数据库图表,它正确显示了麻烦的关系:
我还创建了一个全新的项目并添加了一个新的实体数据模型,该模型指向具有相同凭据的同一数据库,以防万一问题与我正在更新现有模型这一事实有关,但没有骰子。即使在新项目中,也未检测到关系。
我还尝试手动创建导航 属性,但是正如您从该屏幕截图中看到的那样,我需要 select 的外键在下拉列表中不可用:
我不知道这个问题是否与 ExternalID
列不是 User
table 的主键或者它的 NVARCHAR(10)
数据类型。老实说,我不知道。
关于为什么没有检测到这个外键有什么建议吗?我该如何解决?我的项目以 .NET Framework 4.6 为目标,我使用的是 EF6。显然我首先使用数据库。
在 EF6 中,实体只有一个键,因此所有导航属性都必须使用引用相同键的外键。 EF Core 支持 Alternate Keys, and supports a Database-First workflow with Reverse Engineering.