【问题标题】:EF code first migrations, DB generated GUID keysEF 代码首次迁移,DB 生成 GUID 键
【发布时间】:2018-06-19 14:24:10
【问题描述】:

单行问题

如何让 EF 作为代码优先迁移的一部分生成

ALTER TABLE [DMS].[Forms] ADD  CONSTRAINT [DF_DMS.Forms_Id]  DEFAULT (newid()) FOR [Id]
GO

问题的更多细节

我要构建一个简单的表来存储有关表单的信息,碰巧我已经在我的数据库中为另一个表工作了,但是如果我向您展示代码(见下文),您将意识到我的问题我打的比看起来更奇怪......

首先是工作示例实体:

[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)
    ...;

所以一切都很好......然后我使用“update-database”命令迁移我的数据库并编写两个表的脚本......

工作的人:

...
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
...

【问题讨论】:

  • OnModelCreating 方法中是否还有其他配置?
  • 你能把Fileconstructor 贴出来吗? ...因为你的 sql 不同,所以第二个想法是无关紧要的。
  • @DavidG 这是与相关实体相关的所有代码(除了我用...截断的地方)。我剪掉的部分是指实体的外键和其他属性,我剪掉了它们,因为它们似乎与问题无关。如果有帮助的话,我可以在这里列出类的完整代码。
  • 两个文件都没有 ctor @Stefan ...但是在这种情况下你是对的,应该没有区别,这只是我要在这里修复的 SQL ...我可以手动在生成的迁移中添加一行,但我想了解这种差异的来源。
  • 第二个表是否已经创建并且您已经添加了属性?像这样:github.com/aspnet/EntityFrameworkCore/issues/1611 ?

标签: c# sql-server entity-framework-6 entity-framework-migrations


【解决方案1】:

我不知道为什么,但这可以解决问题...

有效的(没有变化):

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 中遇到了某种错误,导致它在某些情况下正确生成迁移。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2015-10-27
    相关资源
    最近更新 更多