C# EF Core-唯一的、索引的、自动生成的guid列,该列不是主键
我正在从.NET EF迁移到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
[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();