簡體   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