【问题标题】:Is it possible to express a check constraint?是否可以表达检查约束?
【发布时间】:2012-03-06 17:17:50
【问题描述】:

我正在使用 Entity Framework 4.3 进行代码优先开发,似乎无法通过属性注释或任何其他方式表达 CHECK constraint。我看到 EF 5.0 将增加对 checking enumerations 的支持,但这并不是我想要的。

举一个简化的例子,我想验证所有 Person 对象的名字都是“Bob”或“Harry”,并且年龄为 5、10 或 30 岁。

public class Person
{
    [Required]
    [Check("Bob", "Harry")]  //yes, this attribute is imaginary
    public string FirstName { get; set; }

    [Required, Check(5, 30, 50)]  //check is still imaginary
    public int Age { get; set; }
}

我可以在事后运行一个修改脚本来添加这些约束,并且我可以滚动我自己的检查属性来执行验证,但是我是否缺少一种方法来实际表达实体框架中的非枚举 CHECK 约束?

【问题讨论】:

    标签: c# entity-framework entity-framework-4.3


    【解决方案1】:

    我一直想加入 Check 约束,虽然有几种方法可以做到这一点,例如 M.Babcock 给出的答案,并使用 Initializer 中的 ExecuteSql 手动向数据库添加约束。

    但我认为最简单的方法是使用 RegularExpression 注释,所以在你的例子中你会去:

    public class Person
    {
        [Required]
        [RegularExpression(@"Bob|Harry")]  
        public string FirstName { get; set; }
    
        [Required, RegularExpression(@"5|30|50")]  
        public int Age { get; set; }
    }
    

    【讨论】:

    • 这仅在您的检查约束可以通过正则表达式验证时才有效。这适用于 OP 的 //simplified examples//。在其他情况下,@M.Babcock 描述的自定义验证将很有用。
    【解决方案2】:

    你可以自己写一个(未经测试):

    public class CheckAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
    {
        object[] ValidValues;
    
        public CheckAttribute<T>(params T[] validValues)
        {
            ValidValues = validValues;
        }
    
        public override bool IsValid(object value)
        {
            return ValidValues.FirstOrDefault(v => v.Equals(value)) != null;
        }
    }
    

    【讨论】:

    • 我确实编写了自己的检查属性(看起来与您的非常相似),但我的问题是这是一个仅限域的属性 - 它没有反映在具有检查约束的后备表实体中就像字符串的 MaxLength 反映在表结构中一样。
    • 我不是很精通 EF,但我在 ILSpy 中打开了EntityFramework.dll,看起来System.Data.Entity.Internal.Validation.EntityValidatorBuilder 负责分析属性并决定如何处理它们。看起来RequiredAttributeMaxLengthAttributeStringLengthAttributeDisplayAttribute 基本上是硬连线到数据库创建过程中的。我不确定是否有可能像今天一样使用 EF 做你所追求的。
    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2014-03-23
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多