【问题标题】:Entity Framework won't detect foreign key from database实体框架不会从数据库中检测外键
【发布时间】:2021-04-07 15:53:18
【问题描述】:

我有两张桌子 - AppointmentUser。约会可以链接到两个不同的用户——一个学生和一个工作人员。 Appointment 表包含两个外键:StaffUsernameExternalIDUser 表中的这些引用列名为 UsernameUser 表的 PK)和 ExternalID(唯一索引)。以下是表定义:

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 我的连接字符串指向正确的数据库。我已经完全删除了设计器中的AppointmentUser 表并再次运行Update 命令。我也尝试过在删除和更新之间保存并重新启动 Visual Studio。

为了检查数据库中的关系是否正确,我在 SSMS 中创建了一个数据库图,它正确地显示了麻烦的关系:

我还创建了一个全新的项目并添加了一个新的实体数据模型,该模型指向具有相同凭据的同一数据库,以防问题与我正在更新现有模型的事实有关,但没有骰子。即使在新项目中,也没有检测到这种关系。

我也尝试手动创建导航属性,但从这个屏幕截图中可以看出,我需要选择的外键在下拉列表中不可用:

我不知道问题是否与ExternalID 列不是User 表的主键或它的NVARCHAR(10) 数据类型有关。老实说,我不知道。

关于为什么没有检测到这个外键有什么建议吗?我该如何解决?我的项目以 .NET Framework 4.6 为目标,我正在使用 EF6。显然我使用的是数据库优先。

【问题讨论】:

    标签: entity-framework entity-framework-6 edmx-designer


    【解决方案1】:

    在 EF6 中,实体只有一个键,因此所有导航属性都必须使用引用相同键的外键。 EF Core 支持Alternate Keys,并支持Reverse Engineering 的数据库优先工作流。

    【讨论】:

    • 感谢您的解释,我怀疑这是我正在做的事情,而 EF 并非旨在处理。我最终进行了重构,因此不需要两个表之间的第二个关系。
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多