【发布时间】:2021-08-05 06:14:26
【问题描述】:
我正在使用 Entity Framework 和 C# 构建一个应用程序,并且在我的一个表中,我注意到我将主键列命名为与外键列同名,即 dbo.MembershipTypes 表的主键打开“ MembershipTypeId”属性,并且与之有关系的dbo.Customers 表在“MembershipTypeId”属性上具有外键,即public MembershipType MembershipTypeId { get; set; })。
这引起了问题,所以我将MembershipTypeId 重命名为Id(最初是Id,但该列不是身份列,并且即使在使用[DatabaseGenereated(DatabaseGeneratedOption.Identity)] 和[Key] 属性)。
我正在使用代码优先迁移,所以当我尝试使用恢复更改时
update-database -TargetMigration:(migration before mistake goes here)
在包管理器控制台中,我收到此错误:
CREATE UNIQUE INDEX 语句终止,因为发现对象名称“dbo.MembershipTypes”和索引名称“PK_dbo.MembershipTypes”的重复键。重复键值为 (0)。 无法创建约束或索引。查看以前的错误。
当我尝试恢复到数据库的早期版本时,它给了我错误的迁移:
public partial class RenameIdColumnAndMakeItIdentityInMembershipTypeTable : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.Customers", "MembershipTypeId", "dbo.MembershipTypes");
DropPrimaryKey("dbo.MembershipTypes");
AddColumn("dbo.MembershipTypes", "MembershipTypeId", c => c.Byte(nullable: false, identity: true));
AddPrimaryKey("dbo.MembershipTypes", "MembershipTypeId");
AddForeignKey("dbo.Customers", "MembershipTypeId", "dbo.MembershipTypes", "MembershipTypeId", cascadeDelete: true);
DropColumn("dbo.MembershipTypes", "Id");
}
public override void Down()
{
AddColumn("dbo.MembershipTypes", "Id", c => c.Byte(nullable: false));
DropForeignKey("dbo.Customers", "MembershipTypeId", "dbo.MembershipTypes");
DropPrimaryKey("dbo.MembershipTypes");
DropColumn("dbo.MembershipTypes", "MembershipTypeId");
AddPrimaryKey("dbo.MembershipTypes", "Id");
AddForeignKey("dbo.Customers", "MembershipTypeId", "dbo.MembershipTypes", "Id", cascadeDelete: true);
}
}
这是用于创建表的 T-SQL 代码 EF。我先用它的属性制作了表格,然后在单独的迁移中用参考数据填充它。
CREATE TABLE [dbo].[MembershipTypes]
(
[SignUpFee] SMALLINT NOT NULL,
[DurationInMonths] TINYINT NOT NULL,
[DiscountRate] TINYINT NOT NULL,
[Name] NVARCHAR(255) DEFAULT ('') NOT NULL,
[MembershipTypeId] TINYINT IDENTITY (1, 1) NOT NULL,
CONSTRAINT [PK_dbo.MembershipTypes]
PRIMARY KEY CLUSTERED ([MembershipTypeId] ASC)
);
这是用于生成客户表的代码:
CREATE TABLE [dbo].[Customers]
(
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (255) NOT NULL,
[IsSubscribedToNewsletter] BIT DEFAULT ((0)) NOT NULL,
[MembershipTypeId] TINYINT DEFAULT ((0)) NOT NULL,
[Birthdate] DATETIME NULL,
CONSTRAINT [PK_dbo.Customers]
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Customers_dbo.MembershipTypes_MembershipTypeId]
FOREIGN KEY ([MembershipTypeId]) REFERENCES [dbo].[MembershipTypes] ([MembershipTypeId])
ON DELETE CASCADE
);
GO
CREATE NONCLUSTERED INDEX [IX_MembershipTypeId]
ON [dbo].[Customers]([MembershipTypeId] ASC);
这一切都是在我尝试修复 API 以使用 [HttpPost] 创建新客户时发生的。
请帮助我了解我收到此错误的原因以及如何解决它。另外,请帮助我理解为什么重复键从 0 而不是 1 开始。
提前感谢您的帮助!
【问题讨论】:
-
在
Down方法中Id不是标识列。 -
谢谢你,@GertArnold!这就是问题所在。在
Down方法中使Id列成为标识列之后,一切都按预期工作。简单的错误,但我学到了很多试图弄清楚。
标签: c# sql-server asp.net-mvc entity-framework ef-code-first