gpt4 book ai didi

c# - EF Core DatabaseGeneratedOption.Computed 如何处理 GUID 属性

转载 作者:行者123 更新时间:2023-12-02 02:44:11 25 4
gpt4 key购买 nike

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

我正在使用 EFCore 3.1.6,后端是 SqlServer。

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

问题:EFCore 迁移难道不应该仅仅通过从注解中推断来为此 TeamId 字段设置默认值吗?还是我需要在 OnModelCreating 中为此字段使用 HasDefaultValueSql("NewId()")

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

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

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

[Required]
public string Name { get; set; }
}

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]

最佳答案

以下任何 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())");

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

关于c# - EF Core DatabaseGeneratedOption.Computed 如何处理 GUID 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63072918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com