我正在寻找一种方法在我的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,该属性充当外键并匹配租户的Id属性。
我想要达到的目的是说每个租户的设置名称必须是唯一的。例如,您可以在“Tenant01”下设置名为“SettingA”的设置,在“Tenant02”下设置“SettingA”(每个设置是两个独立的实体,表中有自己的ID,因此可以有不同的值)是合法的,但不允许另一个设置名称“SettingA”到租户已经存在的地方。
我可以看到很多方法可以通过数据库初始化和添加等时的检查来强制执行直接的唯一性,但没有“条件唯一性”。
答案 0 :(得分:2)
它看起来像[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");
没有迁移