所以我有一个实体EmployeeRegion
EmployeeRegion
是一个弱实体,其中包含表Region
和Employee
中的复合键。
我有一个员工档案,他们可以将自己添加到某个地区。他们得到了地区的下拉
我正在做一个传递,我在模型中的所有内容都符合Asp.net MVC内置的数据验证内容。这很好,因为验证(使用注释)向最终用户显示了非常好的错误消息。
如何使用注释验证复合键是否唯一,如果不是,则显示错误消息?
答案 0 :(得分: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