EF Core DatabaseGenerateOption.Compulated 如何在 GUID 属性上工作

Nar*_*ren 3 c# database-migration entity-framework-core .net-core ef-core-3.1

我有一个Team实体,它有一个GUID TeamId属性,我想在将其保存到数据库时自动生成“添加”值(请注意,属性不是主键)。

我使用 EFCore 3.1.6 & 后端是 SqlServer。

根据 MS 文档,Add 上的值生成取决于数据库提供程序,并且应该为 sql server 自动生成 - https://learn.microsoft.com/en-us/ef/core/modeling/ generated-properties?tabs=数据注释#value- generated-on-add。现在,当我保存新团队时,它会失败,因为 TeamId 不是自动生成的,但它是数据库中的非空字段。

问题: EFCore 迁移不应该仅通过从注释中推断出该 TeamId 字段来设置默认值吗?或者我需要HasDefaultValueSql("NewId()")OnModelCreating这个字段中使用?

如果这HasDefaultValueSql("NewId()")是缺失的部分,那么注释的意义何在?

public class Team
{
    public int Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public Guid TeamId { get; set; }

    [Required]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

efcore数据库迁移创建的表:

CREATE TABLE [dbo].[Teams](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [TeamId] [UNIQUEIDENTIFIER] NOT NULL,
    [Name] [NVARCHAR](MAX) NOT NULL,
 CONSTRAINT [PK_Teams] PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

lau*_*jpn 5

以下任何 Fluent API 语句都适用于您的情况(非 PK 和 SQL Server):

entity.Property(e => e.TeamId)
    .HasValueGenerator<SequentialGuidValueGenerator>();

entity.Property(e => e.TeamId)
    .HasDefaultValueSql("(newsequentialid())");

entity.Property(e => e.TeamId)
    .HasDefaultValueSql("(newid())");
Run Code Online (Sandbox Code Playgroud)

对于Guid作为主键的属性,数据注释[DatabaseGenerated(DatabaseGeneratedOption.Identity)]和 Fluent API 调用.ValueGeneratedOnAdd()也将起作用。两者都将使用SequentialGuidValueGenerator(不是默认值)。