有没有办法限制实体框架中的列的值?

时间:2017-01-27 12:53:16

标签: c# .net entity-framework

我想限制实体框架中实体的属性值。

例如:

public class Position: EntityBase
{
    [AnAtribute("Values:1,2,3")]
    public int Status { get; set; }
    public string ReferenceCode { get; set; }
    public string Location { get; set; }
    public string Content { get; set; }
}

值也可以来自枚举。

在此表中,Status列可以包含值; 1,2或3.否则EF将抛出异常。

我可以创建一个Status表并定义所有状态。但我不想每次都加入那张桌子。所以这不是一个选择。

3 个答案:

答案 0 :(得分:2)

我试过这个并且它可以工作。虽然保存到Db它也给我验证错误。请检查这是否有用。

 public class RangeTest
{
    [Key]
    [Range(1, 3)]
    public int ProjectId { get; set; }

}

enter image description here

答案 1 :(得分:1)

使属性成为枚举并定义该枚举。

public enum Status
{
  SomeStatusA = 1,
  SomeStatusB = 2,
  SomeStatusC = 3,
}
public class Position: EntityBase
{
   public Status Status { get; set; }
   public string ReferenceCode { get; set; }
   public string Location { get; set; }
   public string Content { get; set; }
}

您还可以在状态表上添加foreign key constraint(您提到有一个),这会阻止您在命中数据库时添加/更新超出范围的状态值。

答案 2 :(得分:1)

您需要的是CHECK CONSTRAINT。在SQL中,你会以这种方式改变表格

ALTER TABLE Position
   ADD CONSTRAINT CK_Position_Status CHECK (Status IN (1, 2, 3))

EF目前不支持。即没有一些属性或配置允许您生成带有检查约束的表或更改现有表。但您可以在迁移中手动添加此类约束:

migrationBuilder.Sql(@"ALTER TABLE Position
     ADD CONSTRAINT CK_Position_Status CHECK (Status IN (1, 2, 3))");

另外,我建议您在状态字段中使用枚举而不是整数(如果可能的话)。因此,没有人会猜测'哪些值应该是有效的,哪些不是。