1

我正在寻找一种方法来对我的 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 属性链接到它的租户,该属性充当外键并匹配租户的 Id 属性。

我想要实现的是每个租户的设置名称必须是唯一的。例如,您可以在“Tenant01”下有一个名为“SettingA”的设置,在“Tenant02”下有一个名为“SettingA”的设置(每个都是两个单独的实体,在表中具有自己的 Id,因此可以具有不同的值),并且这个合法,但不允许将另一个设置名称“SettingA”用于已存在的租户。

我可以看到很多方法来通过数据库初始化和添加时检查等来强制执行直接唯一性,但在“条件唯一性”方面没有任何内容。

4

1 回答 1

3

它看起来像是对 [Setting.Name, Setting.TenantId] 的唯一约束

您应该在“代码端”中有验证规则,以避免保存时出现 Sql 错误,并UNIQUE CONSTRAINT在您的数据库中...保持一致。

代码端

这可以通过 FluentValidation 之类的验证库轻松实现,但您也可以使用自定义属性来实现

数据库端

随着迁移

在 up 方法中:

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

在向下方法中:

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

没有迁移

请参阅实体框架代码中的唯一约束

于 2013-05-30T14:40:37.300 回答