C# EF Core-唯一的、索引的、自动生成的guid列,该列不是主键

C# EF Core-唯一的、索引的、自动生成的guid列,该列不是主键,c#,sql-server,entity-framework,ef-fluent-api,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(DatabaseGenerat

我正在从.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; }
但是,当我尝试迁移到EF Core时,在插入数据时收到一条错误消息:>SqlException:无法将值NULL插入列'TenantId',表'DBContext.dbo.Tenants';列不允许空值。插入失败。 声明已终止

这是我的新代码:

    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public Guid TenantId { get; set; }
流利的:

    base.OnModelCreating(builder);
    builder.Entity<Tenant>()
     .HasIndex(t => t.TenantId)
     .IsUnique();
    builder.Entity<Tenant>()
     .Property(t => t.TenantId)
     .ValueGeneratedOnAdd();

这是EF Core不支持的,需要解决的问题吗?

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

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

我认为您得到Null的原因是您应该实例化Guid的值。 差不多

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TenantId { get; set; } = Guid.NewGuid();

如何以及在何处生成唯一GUID?在您的设置中,EFC希望它由数据库提供(带有列
DEFAULT
或其他内容)。在my.NET Framework版本中,它由数据库自动生成。这个'ValueGeneratedOnAdd()'不会生成它吗?我想你需要
hasdaultvaluesql(“NEWID()”)
来代替。我也试过了,但是仍然有一个SqlException不能插入NULL。是的。我需要重新创建迁移以应用所有这些。谢谢添加了
builder.Entity()/.Property(t=>t.TenantId)/.ValueGeneratedOnAdd(),这不一样吗?我以前尝试过,它会产生相同的错误。好的,所以我需要从头开始重新创建整个迁移,以便将此更改反映在数据库中。我以前没有在EF Core中使用guid作为标识列,所以我可以肯定……但如果您尝试,请给我们反馈:)“标识值生成只能用于有符号整数属性”
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TenantId { get; set; } = Guid.NewGuid();