复合键一到二和一到三个Entity Framework 6代码优先

时间:2017-04-03 11:05:00

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

我有一个创建组合键的方案。有没有办法用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; }


}

下图显示了我的需求。

enter image description here

1 个答案:

答案 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构建复合列列表。