zoukankan      html  css  js  c++  java
  • 实现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)

  • 相关阅读:
    如何使用websocket实现前后端通信
    影响MySQL的性能(一)磁盘的选择
    springboot结合日志门面SLF4j和日志实现Logback的使用
    分享一个猜数字小游戏的脚本
    关于drop table *** purge (drop后不过回收站)
    关于DateBase link(dbLINK)及同义词
    关于数据更新(update)
    关于insert into(插入值)
    关于wm_concat(把一列的值,通过','进行分隔后,合并成一个值进行显示)
    关于PIVOT(用于行转列)
  • 原文地址:https://www.cnblogs.com/zuowj/p/4384594.html
Copyright © 2011-2022 走看看