[英]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
將具有兩個 IndexAttributes
它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
來構建復合列列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.