我有一个创建组合键的方案。有没有办法用EF 6代码优先?
我必须在设备和员工中添加限制,以免在同一分支中重复。 branchId
是外键。
我尝试使用下面的类,但它允许我添加branch = 1,device = 2和employee = 1.
public class Employee
{
public Employee()
{
Departments = new HashSet<Department>();
}
[Key]
public long EmployeeId { get; set; }
[ForeignKey("Branch")]
[Index("BranchEmpDev", IsUnique = true, Order = 1)]
public long BranchId { get; set; }
[Index("BranchEmpDev", IsUnique = true, Order = 2)]
public string DevRegNumber { get; set; }
[Index("BranchEmpDev", IsUnique = true, Order = 3)]
public string EmployeeNumber { get; set; }
public virtual Branch Branch { get; set; }
public virtual ICollection<Department> Departments { get; set; }
}
下图显示了我的需求。
答案 0 :(得分:2)
我理解它的方式,目前你有一个名为&#34; BranchEmpDev&#34;的唯一索引(约束)。在(BranchId, DevRegNumber, EmployeeNumber)
字段组合中,您需要两个唯一索引 - 一个在(BranchId, DevRegNumber)
字段组合(我们称之为&#34; BranchDev&#34;)和另一个(BranchId, EmployeeNumber)
字段组合(我们称之为&#34; BranchEmp&#34;)。
这是可能的,虽然不是那么直观(复合键/索引在EF6中通常不直观)。要使用数据注释执行此操作,您可以使用IndexAttribute
s作为当前模型,但使用不同的名称并将其应用于具有所需顺序的相应属性。这意味着BranchId
将有两个 IndexAttributes
- 每个索引都有一个。
解决方案的相关部分如下所示:
[ForeignKey("Branch")]
[Index("BranchEmp", IsUnique = true, Order = 1)]
[Index("BranchDev", IsUnique = true, Order = 1)]
public long BranchId { get; set; }
[Index("BranchEmp", IsUnique = true, Order = 2)]
[StringLength(10)]
public string DevRegNumber { get; set; }
[Index("BranchDev", IsUnique = true, Order = 2)]
[StringLength(10)]
public string EmployeeNumber { get; set; }
在表创建迁移中生成以下部分(仅用于验证):
.Index(t => new { t.BranchId, t.EmployeeNumber }, unique: true, name: "BranchDev")
.Index(t => new { t.BranchId, t.DevRegNumber }, unique: true, name: "BranchEmp");
如您所见,EF将IndexAttribute
与同名合并,并使用Order
构建复合列列表。