C# 每个外键的唯一索引
我正在寻找一种方法,在EF Code First数据库表上执行一些稍微更智能的唯一约束 我有两个模特在玩;一个环境和一个租户C# 每个外键的唯一索引,c#,entity-framework,ef-code-first,constraints,code-first,C#,Entity Framework,Ef Code First,Constraints,Code First,我正在寻找一种方法,在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 Ten
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; }
///
}
公共类设置
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串值{get;set;}
public int TenantId{get;set;}
}
公屋租户
{
///
公共int Id{get;set;}
公共虚拟列表设置{get;set;}
///
}
正如您可能猜到的,设置通过TenantId属性链接到它的租户,该属性充当外键并与租户的Id属性匹配
我想要实现的是,每个租户的设置名称必须是唯一的。例如,您可以在“Tenant01”下有一个名为“SettingA”的设置,在“Tenant02”下有一个名为“SettingA”的设置(每个都是两个单独的实体,在表中有自己的ID,因此可以有不同的值),这是合法的,但不允许在租户已经存在的地方有另一个设置名称“SettingA”
我可以通过数据库初始化和添加时检查等方式看到很多直接强制唯一性的方法,但在“条件唯一性”方面没有任何内容。它看起来像是对[Setting.Name,Setting.TenantId]的唯一约束 您应该在“代码端”中设置验证规则,以避免保存时出现Sql错误,并在数据库中设置
唯一约束。。。保持一致
代码端
这可以通过类似FluentValidation的验证库轻松实现,但也可以通过自定义属性实现
Db侧
迁移
在up方法中:
CreateIndex("dbo.Setting", new[]{"TenantId", "Name"}, true, "Setting_UC");
在向下法中:
DropIndex("dbo.Setting", "Setting_UC");
没有迁移
请参见它看起来像是[Setting.Name,Setting.TenantId]上的唯一约束
您应该在“代码端”中设置验证规则,以避免保存时出现Sql错误,并在数据库中设置唯一约束。。。保持一致
代码端
这可以通过类似FluentValidation的验证库轻松实现,但也可以通过自定义属性实现
Db侧
迁移
在up方法中:
CreateIndex("dbo.Setting", new[]{"TenantId", "Name"}, true, "Setting_UC");
在向下法中:
DropIndex("dbo.Setting", "Setting_UC");
没有迁移
请参见如果我理解得很好,这看起来像是对[Setting.Name,Setting.TenantId]的一个独特约束?我几乎100%相信没有内置结构来完成此操作,但是您可以构建自己的属性来处理它。这将是相当直接的。如果我理解清楚,这看起来像是对[Setting.Name,Setting.TenantId]的一个独特约束?我几乎100%相信没有结构可以完成这一内置操作,但是您可以构建自己的属性来处理它。这将是相当直接的。这对我来说是一个很好的开始。谢谢你显然:“表'dbo.Settings'中的列'Name'属于一种类型,不能用作索引中的键列。”我会亲自研究,但有什么想法吗?@KiraNamida是的,它可能是nvarchar(max)
。索引不接受nvarchar(max)
。。。您必须输入一个较低的值(例如nvarchar(128)
。使其保持最新。通过将字符串最大长度设置为450(最大字符数等于可用的最大字节数)来解决该问题。现在继续解决:ALTER TABLE ALTER COLUMN Name失败,因为一个或多个对象访问此列。更新:这似乎是因为表上存在影响此列的约束。现在跟踪它并确保它已被删除。这对我来说是一个很好的开始。非常感谢。=)显然:“表'dbo.Settings'中的列'Name'的类型不能用作索引中的键列。“我会亲自研究一下,但有什么想法吗?@KiraNamida是的,它可能是一个nvarchar(max)
。索引不接受nvarchar(max)
。您必须输入一个较低的值(如nvarchar(128))
例如,使其保持最新。通过将字符串最大长度设置为450(最大字符数等于可用的最大字节数),解决了该问题。现在继续解决:ALTER TABLE ALTER COLUMN Name失败,因为一个或多个对象访问此列。更新:这似乎是因为表上存在影响此列的约束。现在跟踪它并确保将其删除。