C# 在不作为.NET EF Core索引的情况下设置列唯一null

C# 在不作为.NET EF Core索引的情况下设置列唯一null,c#,entity-framework,asp.net-core,.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,.net Core,Entity Framework Core,我想向表中添加一个字段,该字段应该是唯一的,但不是必需的(因此可以为null),并且不是索引。这在SQL中是可行的,在mysql中是这样的: 创建表MyTable( ... 字段VARCHAR(255)唯一 ... ) 我尝试重写DbContext.OnModelCreating并添加以下内容: 模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder) { //这将创建一个索引,该字段不需要/不需要索引 modelBuilder.Entity() .HasIndex(x

我想向表中添加一个字段,该字段应该是唯一的,但不是必需的(因此可以为null),并且不是索引。这在SQL中是可行的,在mysql中是这样的:

创建表MyTable(
...
字段VARCHAR(255)唯一
...
)
我尝试重写
DbContext.OnModelCreating
并添加以下内容:

模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//这将创建一个索引,该字段不需要/不需要索引
modelBuilder.Entity()
.HasIndex(x=>x.Field)
.IsUnique();
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//这将创建一个NOTNULL约束
modelBuilder.Entity()
.HasAlternateKey(x=>x.Field);
}
下面的代码给了我一条错误消息,说
实体类型“User”上的属性“Field”不能标记为可空/可选,因为它已包含在键{Field}中。

模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//这给了我一个错误
modelBuilder.Entity()
.HasAlternateKey(x=>x.Field);
modelBuilder.Entity()
.Property(x=>x.Field)
.i被要求(虚假);
}

如果有一种方法可以让我手工添加SQL,我会同意的。如果我手工编辑迁移文件,我不知道这是否可行,但是
migration.Design.cs
文件使用相同的
ModelBuilder
类,因此我只能使用相同的方法。

我以前遇到过这个问题。 使用fluentapi无法做到这一点的原因很可能是(我猜测),因为有几个数据库不允许使用此功能,这是有道理的。这篇文章解释了原因:

如果仍要执行此操作,只需在OnModelCreating上运行以下命令:

context.Database.ExecuteSqlCommand("ALTER TABLE table
DROP CONSTRAINT table_constraint"); //SQL Server / Oracle / MS Access

我以前遇到过这个问题。 使用fluentapi无法做到这一点的原因很可能是(我猜测),因为有几个数据库不允许使用此功能,这是有道理的。这篇文章解释了原因:

如果仍要执行此操作,只需在OnModelCreating上运行以下命令:

context.Database.ExecuteSqlCommand("ALTER TABLE table
DROP CONSTRAINT table_constraint"); //SQL Server / Oracle / MS Access

我不知道MySql,但在SQLServer中,惟一约束是通过在后台使用惟一索引实现的。我怀疑MySql可能也会这样做,因为这是一种最佳的方法——因此,如果您担心索引会有额外的存储空间,请不要。唯一约束创建/使用唯一索引。例如,由于您提供的是MySQL示例,请参阅。我不知道MySQL,但在SQL Server中,唯一约束是通过在引擎盖下使用唯一索引实现的。我怀疑MySql可能也会这样做,因为这是一种最佳的方法——因此,如果您担心索引会有额外的存储空间,请不要。唯一约束创建/使用唯一索引。例如,由于您提供的是MySQL示例,请参阅。