2017-06-15 126 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