我有代码第一实体类,其中一列必须有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);
}
HasCheckConstraint
是正确的方法。不幸的是,您创建的检查约束与您的需求不匹配。
您的要求是该列只包含拉丁符号、数字、'_'和'-'符号。
检查约束验证列包含至少一个拉丁符号、数字、'_'或'-'符号。
要正确匹配您的需求,您需要使用:
entity.HasCheckConstraint("CK_SomeTable_SomeColumn", "([Display Name] NOT LIKE '%[^A-Z0-9-_]%')"));
此模式查找不是的任何字符——字母、数字、_
或-
符号。然后该模式被否定——任何匹配该模式的值都是无效的。
LIKE (Transact-SQL) -SQL Server | Microsoft Docs
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);
}