簡體   English   中英

每個外鍵的唯一索引

[英]Unique index per Foreign Key

我正在尋找一種方法來對我的EF Code First數據庫表執行一些稍微更智能的唯一約束。

我有兩個模型在玩; 設置和租戶。

public class Setting
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public int TenantId { get; set; }
}

public class Tenant
{
    ///
    public int Id { get; set; }
    public virtual List<Setting> Settings { get; set; }
    ///
}

正如您可能猜到的,一個設置通過TenantId屬性鏈接到它的Tenant,該屬性充當外鍵並匹配Tenant的Id屬性。

我想要達到的目的是說每個租戶的設置名稱必須是唯一的。 例如,您可以在“Tenant01”下設置名為“SettingA”的設置,在“Tenant02”下設置“SettingA”(每個設置是兩個獨立的實體,表中有自己的ID,因此可以有不同的值)是合法的,但不允許另一個設置名稱“SettingA”到租戶已經存在的地方。

我可以看到很多方法可以通過數據庫初始化和添加等時的檢查來強制執行直接的唯一性,但沒有關於“條件唯一性”的內容。

它看起來像[Setting.Name,Setting.TenantId]上的唯一約束

您應該在“代碼端”中具有驗證規則,以避免在保存時出現Sql錯誤,並且在您的數據庫上使用UNIQUE CONSTRAINT ...是合理的。

代碼方面

這可以通過像FluentValidation這樣的驗證庫輕松實現,但您也可以使用自定義屬性執行此操作

Db方面

隨着遷移

在up方法中:

CreateIndex("dbo.Setting", new[]{"TenantId", "Name"}, true, "Setting_UC");

在down方法中:

DropIndex("dbo.Setting", "Setting_UC");

沒有遷移

請參閱實體框架代碼中的唯一約束

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM