2017-04-03 152 views
-1

我有一个场景来创建组合键。有没有办法用EF 6代码优先做到这一点?复合键一到二和一到三个实体框架6代码优先

我必须添加设备和员工的限制,不要在同一分支复制。 branchId是一个外键。

我尝试使用下面的类,但它让我增加分支= 1,设备= 2,员工= 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; } 


} 

下面图片中展现我需要什么。

enter image description here

+0

创建组合键?你的意思是你正在尝试创建一个复合键吗? – DarthJam

+0

是的,我必须添加设备和员工的限制,不要在同一分支dublicate –

+0

设置赏金带来的关注,但没有提出更好的问题。要获得有意义的答案,首先发布实体类和相关的流利配置(如果有的话)(EF相关问题的最小值)。 –

回答

2

我的理解是,目前你有呼吁(BranchId, DevRegNumber, EmployeeNumber)场组合“BranchEmpDev”一个唯一索引(约束),但你想,而不是两个唯一的指标 - 一个在(BranchId, DevRegNumber)场组合(让通话它“BranchDev”)和另一个(BranchId, EmployeeNumber)字段组合(让它称为“BranchEmp”)。

虽然不太直观(复合键/索引在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 s和同名,并使用Order构建组合列表。

相关问题