EF Core Check约束

时间:2017-06-15 02:29:17

标签: sql sql-server ef-code-first entity-framework-core

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

我一直在寻找我发现的唯一一个问题,那就是一年前我和他们一起使用了一个anwesr。如果有任何改变,我只是在徘徊。其答案如下:

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 个答案:

答案 0 :(得分:3)

假设您的实体被定义为

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;

HasIndex定义表Entity

中的属性索引

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

HasName配置索引的名称。

(如果您将Entity映射到表t并将属性映射到其列名称,则迁移将创建完全相同的sql。)

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

答案 1 :(得分:1)

唯一约束不是检查约束,无论如何,您可以这样创建:

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

答案 2 :(得分:1)

对于 2021 年以后的新手。 EF Core 3+ 支持检查约束。 请参阅:https://stackoverflow.com/a/60199728/1179562