我想限制实体框架中实体的属性值。
例如:
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
表并定义所有状态。但我不想每次都加入那张桌子。所以这不是一个选择。
答案 0 :(得分:2)
我试过这个并且它可以工作。虽然保存到Db它也给我验证错误。请检查这是否有用。
public class RangeTest
{
[Key]
[Range(1, 3)]
public int ProjectId { get; set; }
}
答案 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))");
另外,我建议您在状态字段中使用枚举而不是整数(如果可能的话)。因此,没有人会猜测'哪些值应该是有效的,哪些不是。