这是生成表格的模型类。
public class Mission
{
[Key]
public string Id { get; set; }
[Range(minimum: 1, maximum: int.MaxValue)]
public int MinDayRate { get; set; }
[Range(minimum: 1, maximum: int.MaxValue)]
public int MaxDayRate { get; set; }
}
在 SQL Server 中是: 更改表任务添加约束 CK_MaxDayRate_vs_MinDayRate 检查(MinDayRate <= MaxDayRate );
我如何创建数据注释 MaxDayRate 必须大于 MinDayRate,这将像我的 sql server 示例中那样创建约束?
有数据标注
。但是,[Compare]
检查两个属性是否相等,而不是一个大于另一个。确实存在 EFCore.CheckConstraints,它应用各种 .NET 验证属性作为数据库检查约束。[Compare]
更好的方法是在 OnModelCreating 中使用精确的 SQL 定义任何检查约束:
modelBuilder.Entity<MyModel>()
.HasCheckConstraint("CK_Properties_MinDayRate_MaxDayRate", "[MaxDayRate] > [MinDayRate]");
问题询问如何创建数据注释来完成将一个属性与另一个属性进行比较。该注释称为验证属性,在类中保持验证可能比使用数据库表约束更好。属性已经被使用,所以继续。出于验证目的而相互比较属性有时会发生,因此最好学习如何使用您自己编写的自定义属性来执行此操作。这样你就可以验证几乎任何你能想到的场景。
public class CompareDayRatesAttribute : ValidationAttribute
{
public CompareDayRatesAttribute() { }
public string GetErrorMessage() =>
$"MaxDayRate must be more than MinDayRate";
protected override ValidationResult? IsValid(
object? value, ValidationContext validationContext)
{
var mission = (Mission)validationContext.ObjectInstance;
var maxDayRate = (int)value;
if (maxDayRate < mission.MinDayRate)
{
return new ValidationResult(GetErrorMessage());
}
return ValidationResult.Success;
}
}
新班级看起来像这样:
public class Mission
{
[Key]
public string Id { get; set; }
[Range(minimum: 1, maximum: int.MaxValue)]
public int MinDayRate { get; set; }
[CompareDayRates()]
[Range(minimum: 1, maximum: int.MaxValue)]
public int MaxDayRate { get; set; }
}