实现UniqueAttribute唯一性约束

简介:
复制代码
using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

namespace Zwj.TEMS.Base
{
    /// <summary>
    /// 唯一性标识
    /// </summary>
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public class UniqueAttribute : ValidationAttribute
    {
        protected string tableName;
        protected string filedName;

        public UniqueAttribute(string tableName, string filedName)
        {
            this.tableName = tableName;
            this.filedName = filedName;
        }

        public override Boolean IsValid(Object value)
        {
            bool validResult = false;
            //TEMSContext 是我项目中的DB上下文类,若需要使用在其它项目中,请更改成实际的DB上下文类就可以了!
            using (TEMSContext context = new TEMSContext())
            {
               string sqlCmd=string.Format("select count(1) from [{0}] where [{1}]=@p0",tableName,filedName);
               context.Database.Connection.Open();
               var cmd=context.Database.Connection.CreateCommand();
               cmd.CommandText = sqlCmd;
               var p0 = cmd.CreateParameter();
               p0.ParameterName = "@p0";
               p0.Value = value;
               cmd.Parameters.Add(p0);
               int result=Convert.ToInt32(cmd.ExecuteScalar());
                validResult=(result<=0);
            }
            return validResult;
        }
    }
}
复制代码

在实体中使用方法如下:

复制代码
        /// <summary>
        /// 类别代码
        /// </summary>
        [Required()]
        [MaxLength(50)]
        [Unique("Category", "CategoryCode")]
        [Display(Name = "类别代码")]
        public string CategoryCode { get; set; }
复制代码

 

调用与验证方法如下:

复制代码
//我这里写了一个单元测试的验证方法,大家可以用在实际项目中        
public void ValidateEntity(object entity)
        {
            var t = entity.GetType();
            var properties = t.GetProperties();
            foreach (var p in properties)
            {
                UniqueAttribute[] attrs;
                if (p.TryGetAttribute<UniqueAttribute>(out attrs))
                {
                    bool result = attrs[0].IsValid(p.GetValue(entity, null));
                    Assert.IsTrue(result, "验证不唯一,存在重复值!");
                }
            }
        }
复制代码
 
复制代码
    public static class ClassExtension
    {
        /// <summary>
        /// 尝试获取指定类别特性
        /// </summary>
        /// <typeparam name="TAttribute"></typeparam>
        /// <param name="p"></param>
        /// <param name="returnAttrs"></param>
        /// <returns></returns>
        public static bool TryGetAttribute<TAttribute>(this PropertyInfo p, out TAttribute[] returnAttrs) where TAttribute : Attribute
        {
            var attrs = p.GetCustomAttributes(typeof(TAttribute), false);
            if (attrs != null && attrs.Length > 0)
            {
                returnAttrs = attrs.Select(t => t as TAttribute).ToArray();
                return true;
            }
            returnAttrs=null;
            return false;
        }
    }
复制代码
 

 



以下是博客园的相关文章,他主要描述的是如何在数据库中生成唯 一性索引,而对如何在C#进行唯一性验证并没有说明,我这篇文章仅作一个补充。

如何在EF CodeFirst中使用唯一约束(Unique)

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4384594.html  ,如需转载请自行联系原作者
相关文章
|
3月前
|
SQL 数据管理 数据库
|
6月前
唯一性约束:unique
唯一性约束:unique。
69 3
|
6月前
|
存储 关系型数据库 MySQL
MySQL约束 【主键约束丨唯一约束丨非空约束丨外键级联】
MySQL约束 【主键约束丨唯一约束丨非空约束丨外键级联】
134 0
|
存储 关系型数据库 MySQL
第13章_约束
第13章_约束
130 0
|
Oracle 关系型数据库 索引
唯一约束和唯一索引区别
唯一约束和唯一索引区别
892 0
|
SQL 关系型数据库 MySQL
列的完整性约束——主键约束
列的完整性约束——主键约束
|
数据库
主键规则
主键规则
209 0
|
关系型数据库 MySQL 索引
【MySQL8.0学习笔记】约束:主键约束、自增长约束、非空约束、唯一性约束、默认约束与零填充约束
文章目录 1 MySQL约束简介 2 主键约束 2.1 主键约束的操作 2.1.1 添加单列主键 2.1.2 添加多列联合主键 2.1.3 通过修改表结构的方式添加主键 2.1.4 删除主键 3 自增长约束 3.1 指定自增长字段的初始值 3.1.1 delete和truncate在删除后自增列的变化 4 非空约束 5 唯一约束 6 默认约束 7 零填充约束(zerofill)
|
存储 数据库
5_数据完整性-数据类型和约束
5_数据完整性-数据类型和约束
88 0
|
关系型数据库 MySQL 索引
MySQL约束——添加主键约束(联合主键)、删除主键约束
MySQL约束——添加主键约束(联合主键)、删除主键约束
2222 0