【问题标题】:RegularExpression migration to SQL Server正则表达式迁移到 SQL Server
【发布时间】:2021-09-18 06:39:20
【问题描述】:

我有代码优先实体类,其中一列的长度必须为 20 个字符,并且只包含拉丁符号、数字、“_”和“-”符号。

我写了这个正则表达式@"^[A-Z0-9\-\_]$",但是当运行add-migration并生成数据库时,在SQL Server中这个表达式不被接受。

 [DataContract(IsReference = true)]
    public partial class Vendor : IBaseEntity
    {
        [Key, DataMember, MaxLength(20), RegularExpression(@"^[A-Z0-9\-\_]{1,20}$",
                                   ErrorMessage = "")]
        public string No { get; set; }
    }

能否帮助在 SQL Server 中键入或迁移此限制?或者如果这种方法不起作用,还有什么其他方法可以做到这一点?

可能会解决

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
                   
            modelBuilder.Entity<Company>(entity =>
                           entity.HasCheckConstraint("CK_SomeTable_SomeColumn", "([Display Name] NOT LIKE '%[A-Z0-9\-\_]%')"));


            base.OnModelCreating(modelBuilder);
        }

【问题讨论】:

  • 您真的希望数据库进行正则表达式检查吗?然后如果它失败了怎么办..抛出异常?将正则表达式放在set 中并在c# 端执行如何? (你不想在你的视图模型中这样做吗?当数据到达数据库实体时,它应该已经“正确”了?)
  • SQL Server 不支持这种正则表达式.....
  • 感谢您的回答,但我希望在 SQL Server 数据库中接受、保存和使用此限制,或者如果此方法不起作用,还有其他方法吗?

标签: c# sql-server entity-framework


【解决方案1】:

HasCheckConstraint 是正确的方法。很遗憾,您创建的检查约束不符合您的要求。

您的要求是该列仅包含拉丁符号、数字、“_”和“-”符号

您的检查约束验证该列是否包含至少一个拉丁符号、数字、“_”或“-”符号

要正确满足您的要求,您需要使用:

entity.HasCheckConstraint("CK_SomeTable_SomeColumn", "([Display Name] NOT LIKE '%[^A-Z0-9\-\_]%')"));

此模式查找字母、数字、_- 符号的任何字符。然后该模式被否定 - 任何与该模式匹配的值都是无效的。

LIKE (Transact-SQL) - SQL Server | Microsoft Docs

【讨论】:

    【解决方案2】:

    EF 中的解决方案

    protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                       
                modelBuilder.Entity<Company>(entity =>
                               entity.HasCheckConstraint("CK_SomeTable_SomeColumn", "([Display Name] NOT LIKE '%[A-Z0-9\-\_]%')"));
    
    
                base.OnModelCreating(modelBuilder);
            }
    

    【讨论】:

    • 该检查约束验证您的列是否包含至少一个字母、数字、破折号或下划线。这不符合您的要求,即该列 包含字母、数字、破折号或下划线。
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多