繁体   English   中英

在 .NET EF Core 中设置列​​唯一空值而不是索引

[英]Setting a column unique null without being an index in .NET EF Core

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

CREATE TABLE MyTable (
  ...
  field VARCHAR(255) UNIQUE
  ...
)

我尝试覆盖DbContext.OnModelCreating并添加这些:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // this creates an index, which I don't need/want for this field
    modelBuilder.Entity<User>()
        .HasIndex(x => x.Field)
        .IsUnique();

}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // This creates a NOT NULL Constraint
    modelBuilder.Entity<User>()
        .HasAlternateKey(x => x.Field);
}

下面的代码给了我一条错误消息,指出The property 'Field' on entity type 'User' cannot be marked as nullable/optional because it has been included in a key {'Field'}.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // This gives me an error
    modelBuilder.Entity<User>()
        .HasAlternateKey(x => x.Field);
    modelBuilder.Entity<User>()
        .Property(x => x.Field)
        .IsRequired(false);
}

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

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

MySQL:没有索引的唯一约束

如果您仍然想这样做,只需像这样在 OnModelCreating 上运行命令:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM