EF 代码首先迁移,DB 生成的 GUID 键
EF code first migrations, DB generated GUID keys
一道题
如何让 EF 作为代码首次迁移的一部分生成
ALTER TABLE [DMS].[Forms] ADD CONSTRAINT [DF_DMS.Forms_Id] DEFAULT (newid()) FOR [Id]
GO
问题的更多细节
我要构建一个简单的 table 来存储有关表单的信息,碰巧我已经在我的数据库中为另一个 table 工作了,但是如果我向您展示代码 (见下文)你会意识到我遇到的问题比看起来更奇怪......
首先是工作示例实体:
[Table("Files", Schema = "DMS")]
public class File
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
...
}
好的,现在不工作了...
[Table("Forms", Schema = "CMS")]
public class Form
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
...
}
如问题中所述,我首先使用 EF 代码,因此这是迁移代码:
工作的:
CreateTable(
"DMS.Files",
c => new
{
Id = c.Guid(nullable: false),
...
})
.PrimaryKey(t => t.Id)
...;
...和不工作的...
CreateTable(
"CMS.Forms",
c => new
{
Id = c.Guid(nullable: false),
...
})
.PrimaryKey(t => t.Id)
...;
所以一切都很好......然后我使用“更新数据库”命令迁移我的数据库并编写两个 tables 的脚本......
工作的:
...
CREATE TABLE [DMS].[Files](
[Id] [uniqueidentifier] NOT NULL,
...
CONSTRAINT [PK_DMS.Files] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [DMS].[Files] ADD CONSTRAINT [DF_DMS.Files_Id] DEFAULT (newid()) FOR [Id]
GO
...
...和不工作的...
...
CREATE TABLE [CMS].[Forms](
[Id] [uniqueidentifier] NOT NULL,
...
CONSTRAINT [PK_CMS.Forms] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
...
我不知道为什么,但这有效并解决了问题...
工作的(没有变化):
CreateTable(
"DMS.Files",
c => new
{
Id = c.Guid(nullable: false),
...
})
.PrimaryKey(t => t.Id)
...;
...和非工作的(已应用修复)...
CreateTable(
"CMS.Forms",
c => new
{
Id = c.Guid(nullable: false, defaultValueSql: "newid()"),
...
})
.PrimaryKey(t => t.Id)
...;
我想我一定是遇到了 EF 中的某种错误,导致它在某些情况下正确生成迁移。
一道题
如何让 EF 作为代码首次迁移的一部分生成
ALTER TABLE [DMS].[Forms] ADD CONSTRAINT [DF_DMS.Forms_Id] DEFAULT (newid()) FOR [Id]
GO
问题的更多细节
我要构建一个简单的 table 来存储有关表单的信息,碰巧我已经在我的数据库中为另一个 table 工作了,但是如果我向您展示代码 (见下文)你会意识到我遇到的问题比看起来更奇怪......
首先是工作示例实体:
[Table("Files", Schema = "DMS")]
public class File
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
...
}
好的,现在不工作了...
[Table("Forms", Schema = "CMS")]
public class Form
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
...
}
如问题中所述,我首先使用 EF 代码,因此这是迁移代码:
工作的:
CreateTable(
"DMS.Files",
c => new
{
Id = c.Guid(nullable: false),
...
})
.PrimaryKey(t => t.Id)
...;
...和不工作的...
CreateTable(
"CMS.Forms",
c => new
{
Id = c.Guid(nullable: false),
...
})
.PrimaryKey(t => t.Id)
...;
所以一切都很好......然后我使用“更新数据库”命令迁移我的数据库并编写两个 tables 的脚本......
工作的:
...
CREATE TABLE [DMS].[Files](
[Id] [uniqueidentifier] NOT NULL,
...
CONSTRAINT [PK_DMS.Files] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [DMS].[Files] ADD CONSTRAINT [DF_DMS.Files_Id] DEFAULT (newid()) FOR [Id]
GO
...
...和不工作的...
...
CREATE TABLE [CMS].[Forms](
[Id] [uniqueidentifier] NOT NULL,
...
CONSTRAINT [PK_CMS.Forms] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
...
我不知道为什么,但这有效并解决了问题...
工作的(没有变化):
CreateTable(
"DMS.Files",
c => new
{
Id = c.Guid(nullable: false),
...
})
.PrimaryKey(t => t.Id)
...;
...和非工作的(已应用修复)...
CreateTable(
"CMS.Forms",
c => new
{
Id = c.Guid(nullable: false, defaultValueSql: "newid()"),
...
})
.PrimaryKey(t => t.Id)
...;
我想我一定是遇到了 EF 中的某种错误,导致它在某些情况下正确生成迁移。