Asp.net MVC,验证具有弱实体的唯一行

时间:2017-03-06 18:37:49

标签: c# asp.net asp.net-mvc entity-framework

所以我有一个实体EmployeeRegion

EmployeeRegion是一个弱实体,其中包含表RegionEmployee中的复合键。

我有一个员工档案,他们可以将自己添加到某个地区。他们得到了地区的下拉

enter image description here

我正在做一个传递,我在模型中的所有内容都符合Asp.net MVC内置的数据验证内容。这很好,因为验证(使用注释)向最终用户显示了非常好的错误消息。

如何使用注释验证复合键是否唯一,如果不是,则显示错误消息?

1 个答案:

答案 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