是否可以通过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;
答案 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