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)
以下任何 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(不是默认值)。
| 归档时间: |
|
| 查看次数: |
4763 次 |
| 最近记录: |