2017-06-15 129 views
0

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

我一直在环顾四周,我发现的唯一问题是在一年前使用anwesr的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; 

回答

2

假设你的实体被定义为

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配置索引的名称。

(如果映射Entityt &属性他们的列名,迁移将你想要创建完全相同的SQL。)

而且检查约束是唯一索引不同。如果您希望添加检查约束,那么您需要在迁移文件中使用migrationBuilder.Sql

0

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

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

我错过了一个细节:您的索引是**过滤**索引,但没有“过滤约束” – sepupic