[英]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 无法做到这一点的原因很可能是(我在推测),因为有几个数据库不允许使用此功能,这是有道理的。 这篇文章解释了原因:
如果您仍然想这样做,只需像这样在 OnModelCreating 上运行命令:
context.Database.ExecuteSqlCommand("ALTER TABLE table
DROP CONSTRAINT table_constraint"); //SQL Server / Oracle / MS Access
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.