gpt4 book ai didi

C# Entity Framework 自定义约束

转载 作者:行者123 更新时间:2023-11-30 16:00:28 25 4
gpt4 key购买 nike

我目前正在尝试使用 C# Entity Framework 进行自定义约束。更详细:

我有一个数字字段,它只能有特定的值(例如 1、2 和 3)。我如何在代码优先环境中实现此约束?

最佳答案

Entity Framework 通过 ValidationAttribute 自动验证您添加到模型中的任何验证秒。 RequiredAttributeRangeAttribute 是此属性的内置子类的两个示例。

如果您想要一些自定义验证,最方便的方法是利用此机制并创建您自己的 ValidationAttribute 子类。

如果你想验证一个不连续的值范围,你不能使用 RangeAttribute 但你可以创建一个自己的属性,例如像这样:

public class AllowedValuesAttribute : ValidationAttribute
{
private readonly ICollection<object> _validValues;
private readonly Type _type;

public AllowedValuesAttribute(Type type, object[] validValues)
{
_type = type;
_validValues = validValues.Where(v => v != null && v.GetType() == type).ToList();
}

public override bool IsValid(object value)
{
return value.GetType() == _type && _validValues.Contains(value);
}

public override string FormatErrorMessage(string name)
{
return string.Format("Value for '{0}' is not an allowed value", name);
}
}

用法:

[AllowedValues(typeof(int), new object[] { 1, 2, 4, 8, 16 })]
public int Base { get; set; }

注意这里我们必须使用固定值,因为属性的内容必须在编译时就知道了。此外,我们必须使用 object 因为(目前)C# 不支持通用属性。除此之外,还有很多选择。例如,该属性还可以有一个在运行时查找允许值的方法,可能来自命名源,因此您可以在其构造函数中提供此名称。

我没有发现用验证属性装饰实体类有任何问题。实体模型不是领域模型,它是数据访问层的一部分。它的主要目的是(并且应该是)促进应用程序的数据访问。如果实体模型也恰好支持业务逻辑,那简直是额外收获。

关于C# Entity Framework 自定义约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com