【问题标题】:Unique index per Foreign Key每个外键的唯一索引
【发布时间】:2013-05-30 14:25:55
【问题描述】:

我正在寻找一种方法来对我的 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; }
    ///
}

您可能已经猜到,一个 Setting 通过 TenantId 属性链接到它的租户,该属性充当外键并匹配租户的 Id 属性。

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

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

【问题讨论】:

  • 如果我理解得很好,这看起来像是对 [Setting.Name, Setting.TenantId] 对的唯一约束?
  • 我几乎 100% 确信没有内置的结构可以执行此操作,但是您可以构建自己的属性来处理它。这将是相当直截了当的。

标签: c# entity-framework ef-code-first constraints code-first


【解决方案1】:

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

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

代码端

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

数据库端

有迁移

向上方法:

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

向下方法:

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

没有迁移

Unique Constraint in Entity Framework Code First

【讨论】:

  • 这对我来说是一个很好的开始。非常感谢你。 =)
  • 显然:“表 'dbo.Settings' 中的列 'Name' 的类型不能用作索引中的键列。”我自己会调查这个,但有什么想法吗?
  • @KiraNamida 是的,可能是nvarchar(max)。并且索引不接受nvarchar(max)...您必须输​​入较低的值(例如nvarchar(128)
  • 保持最新。通过将字符串最大长度设置为 450(等于最大可用字节数的最大字符数)解决了这个问题。现在继续解决:ALTER TABLE ALTER COLUMN Name failed 因为一个或多个对象访问此列。
  • 更新:这似乎是因为表上存在影响该列的约束。现在追踪它并确保它已被删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2010-10-09
  • 2012-10-25
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多