簡體   English   中英

一鍵至二鍵和一鍵至第三鍵Entity Framework 6代碼優先

[英]Composite key one to second and one to third Entity Framework 6 code-first

我有一個創建按鍵組合的方案。 有什么辦法可以使用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; }


}

下圖顯示了我所需要的。

在此處輸入圖片說明

據我了解,目前,您在(BranchId, DevRegNumber, EmployeeNumber)字段組合上有一個唯一的索引(約束),稱為“ BranchEmpDev”,但是您想要兩個唯一索引-一個在(BranchId, DevRegNumber)字段組合上(使將其稱為“ BranchDev”),並將其命名為(BranchId, EmployeeNumber)字段組合(將其稱為“ BranchEmp”)。

有可能,盡管不是那么直觀(復合鍵/索引在EF6中通常不直觀)。 為此,可以使用數據注釋,就像在當前模型中一樣使用IndexAttribute ,但要使用不同的名稱 ,然后按所需順序將它們應用於相應的屬性。 這意味着BranchId將具有兩個 IndexAttributesIndexAttributes的每個索引都具有一個。

解決方案的相關部分如下所示:

[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來構建復合列列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM