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

时间:2017-11-07 07:19:18

标签: 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; }

但是,当我尝试迁移到EF Core时,我在插入数据时收到错误消息:> SqlException:无法将值NULL插入列'TenantId',表'DBContext.dbo.Tenants';列不允许空值。 INSERT失败。 声明已经终止。

这是我的新代码:

    [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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-3)

我认为您获得Null的原因是因为您应该实例化Guid的值。 像

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