C#自定义验证唯一属性-泛型类我正在尝试做一个自定义验证[IsUnique]。检查属性值是否唯一并返回正确的消息。这是我的代码,但这只适用于指定的类,有没有办法通过元数据获取正确的类?公共类ArticleMetaData{[Required(AllowEmptyStrings=false)][IsUnique("Name")]publicStringName{get;放;我的自定义验证:classIsUnique:ValidationAttribute{publicIsUnique(stringpropertyNames){this.属性名=属性名;}publicstringPropertyNames{get;私有集;}protectedoverrideValidationResultIsValid(objectvalue,ValidationContextvalidationContext){varmyproperty=validationContext.ObjectType.GetProperty(PropertyNames);varvalue=propiedad.GetInanceValue(ObjectvalidationContext.null);IEnumerable属性;列表属性List=newList();propertiesList.Add(myproperty.Name);vardba=newmyContext();if(dba.Articles.Any(article=>article.Name==(string)value)){returnnewValidationResult("名称已经存在",propertiesList);}返回空值;想法是只使用注释[isUnique],该方法将获取注释类并搜索相应的实体。在写验证属性的时候,可以使用ValidationContext获取一些验证的信息,比如要验证的属性的名称,要验证的对象的类型等,这样就不需要声明检查哪个属性的唯一性了,或者应该检查哪个实体,或者使用反射来检索值的事件,因为该值已传递给IsValid方法。使用DbContext时,您可以执行Sql查询,因此您可以使用SQL查询来简单地检查唯一性。它比尝试动态创建通用linq查询更简单。也许这个想法会对你有所帮助。遵循这个想法,对代码进行一些更改:varclassName=validationContext.ObjectType.Name.Split('.').Last();varpropertyName=validationContext.MemberName;varparameterName=string.Format("@{0}",propertyName);varresult=db.Database.SqlQuery(string.Format("SELECTCOUNT(*)FROM{0}WHERE{1}={2}",className,propertyName,parameterName),newSystem.Data.SqlClient.SqlParameter(参数名,价值));if(result.ToList()[0]>0){returnnewValidationResult(string.Format("The'{0}'alreadyexist",propertyName),newList(){propertyName});}返回空值;要使用此属性,只需将[IsUnique]放在属性上方即可。[IsUnique]YourProperty{get;放;然后使用如下代码运行测试:vardb=newYourDbContext();db.Configuration.ValidateOnSaveEnabled=true;db.Categories.Add(newYourEntity(){YourProperty="DuplicateName"});db.SaveChanges();最好只使用可以离线验证的属性来验证实体的这些方面。StringLength、RegularExpression、Required等验证属性是良好属性的示例,检查唯一性或其他数据库相关规则的验证属性是不适当属性的示例。我认为最好的方法是让数据库完成它的工作。在数据库中创建一个约束以防止两篇文章具有相同的名称(或您需要的任何唯一性)。然后,当用户创建新文章或使用现有文章名称更新现有文章时,数据库会抛出异常。捕获异常并让用户知道问题所在。拥有通用属性会很好,但不支持这些属性。但是,您可以尝试DbContext的Set方法,该方法将实体类型作为参数。要查询非genericsDbSet,您可以使用System.Linq.Dynamic库(您可以从NuGet添加它)。它允许使用字符串谓词查询DbSet。这是一个例子:以上是C#学习教程:C#自定义校验唯一属性-泛型类分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——varexistingEntityQuery=myContext.Set(validationContext.ObjectType).Where("Name=@0",(string)value);varenumerator=existingEntityQuery.GetEnumerator();if(enumerator.MoveNext()){varentity=enumerator.Current;if(entity!=null){returnnewValidationResult("名称已经存在",propertiesList);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
