gpt4 book ai didi

c# - 设置列唯一 null 而不是 .NET EF Core 中的索引

转载 作者:行者123 更新时间:2023-12-05 05:04:42 25 4
gpt4 key购买 nike

我想向表中添加一个字段,该字段应该是唯一的,但不是必需的(因此它可以为空)并且它不是索引。这在 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);
}

下面的代码给我一条错误消息,说 实体类型“User”上的属性“Field”不能标记为可为空/可选,因为它已包含在键 {'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: UNIQUE constraint without index

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

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

关于c# - 设置列唯一 null 而不是 .NET EF Core 中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60927199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com