2017-04-03 155 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構建組合列表。

相關問題