提问者:小点点

EF核心-唯一的,索引的,自动生成的不是主键的guid列


我正在从。NET EF迁移到EF核心。我有一个有效的解决方案,它自动生成一个除了主键之外的唯一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插入到表'DBContext.DBO.Tenters'的列'TenantId'中;列不允许空值。插入失败。语句已终止。

这是我的新代码:

    [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();

这是通过使用:

         _context.Tenants.Add(tenant);
        await _context.SaveChangesAsync();

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


共2个答案

匿名用户

在新代码中,没有[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();