【发布时间】:2021-11-23 22:20:30
【问题描述】:
我在实体框架中有一个主键作为外键。
public class RailcarTrip
{
[Key, ForeignKey("WaybillRailcar")]
public int WaybillRailcarId { get; set; }
public WaybillRailcar WaybillRailcar { get; set; }
// Etc.
}
这似乎工作正常,并生成下表。
CREATE TABLE [dbo].[RailcarTrips](
[WaybillRailcarId] [int] NOT NULL,
[StartDate] [datetime2](7) NOT NULL,
[DeliveryDate] [datetime2](7) NULL,
[ReleaseDate] [datetime2](7) NULL,
[ReturnDate] [datetime2](7) NULL,
[DeliveryEta] [datetime2](7) NULL,
[ReleaseEta] [datetime2](7) NULL,
[ReturnEta] [datetime2](7) NULL,
[ReturnCity] [nvarchar](80) NULL,
[ReturnState] [nvarchar](2) NULL,
[TripType] [int] NOT NULL,
CONSTRAINT [PK_RailcarTrips] PRIMARY KEY CLUSTERED
(
[WaybillRailcarId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[RailcarTrips] WITH CHECK ADD CONSTRAINT [FK_RailcarTrips_WaybillRailcars_WaybillRailcarId] FOREIGN KEY([WaybillRailcarId])
REFERENCES [dbo].[WaybillRailcars] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[RailcarTrips] CHECK CONSTRAINT [FK_RailcarTrips_WaybillRailcars_WaybillRailcarId]
GO
但是当我尝试更改此 PK/FK 以使其引用不同的记录时出现错误。
“RailcarTrip.WaybillRailcarId”属性是键的一部分,因此不能修改或标记为已修改。要使用标识外键更改现有实体的主体,首先删除依赖项并调用“SaveChanges”,然后将依赖项与新主体关联。
我不明白为什么这是个问题?主键未设置为实体/自动设置。此代码应该是 FK 的简单更新。我不想删除任何东西。谁能解释为什么这是个问题?
这似乎是实体框架错误,而不是 SQL Server 错误。
【问题讨论】:
-
为什么您不添加自动增量主键而忘记这一点。否则在整个项目开发过程中你会一个接一个的出现问题。
-
@Serge:因为,作为 PK/FK,我需要能够将此 PK 设置为特定的行 ID。 Entity Framework 将自动使 PK 自动递增。但它在这里没有正确地做到这一点。
-
这将使更改 FK 的成本更低,并使 EF 能够支持该操作。
标签: c# sql sql-server entity-framework entity-framework-core