2017-03-06 75 views
0

唯一行的驗證所以我有一個實體EmployeeRegionAsp.net MVC,弱實體

EmployeeRegion是一個弱實體從表RegionEmployee複合鍵。

我有一個員工檔案,他們可以將自己添加到一個地區。他們得到一個下拉與地區

enter image description here

我做了一通,我得到的模型符合一種建立在以Asp.net MVC數據驗證的東西應有盡有。這很好,因爲驗證(使用註釋)向最終用戶顯示非常棒的錯誤消息。

如何使用註釋驗證組合鍵是否唯一,如果不是,則顯示錯誤消息?

+0

給你的表(和實體)一個複合唯一索引。 – DavidG

+0

你能詳細說明一下嗎? –

+0

你能展示你的實體最初的樣子嗎? – DavidG

回答

1

基本上,你只需要:

public class EmployeeRegion 
{ 
    [Key, Column(Order = 1)] 
    public int EmployeeId { get; set; } 
    public virtual Employee Employee { get; set; } 

    [Key, Column(Order = 2)] 
    public int RegionId { get; set; } 
    public virtual Region Region { get; set; } 
} 

換句話說,你缺少的部分是[Key, Column(Order = N)]。這使得id成爲一個實際的組合鍵,它開箱即不會允許重複。

但是,所有這些都會使API在處理這種M2M關係時變得更加困難。如果表中的唯一數據是關鍵,有沒有需要的關係附加數據的有效載荷,那麼你應該擺脫這種實體的,只是讓EF處理的關係:

public class Employee 
{ 
    ... 

    public virtual ICollection<Region> Regions { get; set; } 
} 

public class Region 
{ 
    ... 

    public virtual ICollection<Employee> Employees { get; set; } 
} 

在幕後,EF將創建一個類似於EmployeeRegion的表格,但您不需要負責管理該表格,並且確保獨特關係等內容將被烘焙。這也爲您提供了一個更容易處理的API。例如。爲了讓所有的員工一個區域,目前,你必須做一些事情,如:

dbo.EmployeeRegions.Where(m => m.Region.Id == regionId).Select(m => m.Employee) 

然而,通過允許EF來處理它,你可以這樣做:

region.Employees