EF Core - 唯一、索引、自动生成的非主键的 guid 列

pau*_*ode 5 c# sql-server entity-framework ef-fluent-api

我正在从 .NET EF 迁移到 EF CORE。我有一个可行的解决方案,可以自动生成除主键之外的唯一 GUID。下面是解决方案。

    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Index(IsUnique = true)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid TenantId { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试迁移到 EF Core 时,插入数据时收到错误消息: >SqlException: Cannot insert the value NULL into columns 'TenantId', table 'DBContext.dbo.Tenants'; 列不允许为空。插入失败。该语句已终止。

这是我的新代码:

    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public Guid TenantId { get; set; }
Run Code Online (Sandbox Code Playgroud)

流利:

    base.OnModelCreating(builder);
    builder.Entity<Tenant>()
     .HasIndex(t => t.TenantId)
     .IsUnique();
    builder.Entity<Tenant>()
     .Property(t => t.TenantId)
     .ValueGeneratedOnAdd();
Run Code Online (Sandbox Code Playgroud)

这是通过使用以下方式插入的:

         _context.Tenants.Add(tenant);
        await _context.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)

这是否是 EF Core 不支持的并且需要解决方法?

小智 1

在您的新代码上,您没有注释[DatabaseGenerated(DatabaseGeneratedOption.Identity)]。你的代码应该是:

[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TenantId { get; set; }
Run Code Online (Sandbox Code Playgroud)