EF Core 检查约束

3

是否可以通过EF Core向表添加检查约束。

我一直在寻找答案,但唯一找到的问题是关于Ef 7的,并且已经有一年的答案了。所以我只是想知道是否有任何改变。以下是给出的答案:

migrationBuilder.Sql("ADD CONSTRAINT CK_SomeTable_SomeColumn CHECK (SomeColumn >= X);");

有没有其他方法可以做到这一点?我想要应用以下唯一约束:

CREATE UNIQUE INDEX unq_t_parent_child ON t(parent, child)
WHERE isdeleted = 0;
3个回答

4
假设您的实体已经定义为以下内容:
public class Entity
{
    public int Id { get; set; }
    public int Parent { get; set; }
    public int Child { get; set; }
}

以下流畅的API代码将按照您的要求创建索引:
modelBuilder.Entity<Entity>().HasIndex(p => new {p.Parent, p.Child})
        .HasFilter("isdeleted = 0")
        .HasName("unq_t_parent_child");

生成的SQL语句

CREATE INDEX [unq_t_parent_child] ON [Entity] ([Parent], [Child]) WHERE isdeleted = 0;
< p > HasIndex 定义了表格 Entity 中属性的索引。

HasFilter 允许您为索引设置过滤器。这个值是 SQL 语句,所以您需要确保编写正确的 SQL 语法。

HasName 配置索引的名称。

(如果将 Entity 映射到表格 t 并将属性映射到它们的列名,则迁移将创建完全相同的 SQL,就像您想要的那样)。

此外,检查约束与唯一索引不同。如果您要添加检查约束,则需要在迁移文件中使用 migrationBuilder.Sql


3

2

唯一约束不是检查约束,但无论如何,您都可以按照以下方式创建它:

alter table dbo.t
ADD CONSTRAINT UQ_parent_child UNIQUE (parent, child)

我在这里错过了一个细节:您的索引是过滤索引,但没有“过滤约束”。 - sepupic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接