예제 #1
0
        /// <inheritdoc />
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (!Unique)
            {
                return(ValidationResult.Success);
            }
            if (value is null)
            {
                return(ValidationResult.Success);
            }
            if (validationContext.ObjectInstance is null)
            {
                return(ValidationResult.Success);
            }

            if (validationContext.TryGetDbContext(out var context))
            {
                var            conn          = context.Database.GetDbConnection();
                ICustomCommand customCommand = null;

                lock (Queries)
                {
                    if (Queries.ContainsKey(validationContext.ObjectType))
                    {
                        customCommand = Queries[validationContext.ObjectType];
                    }
                }

                if (customCommand is null)
                {
                    customCommand = validationContext.CreateFilteredCountQuery(true, validationContext.MemberName);
                    lock (Queries)
                    {
                        Queries[validationContext.ObjectType] = customCommand;
                    }
                }

                if (string.IsNullOrEmpty(customCommand.SqlStatement))
                {
                    return(ValidationResult.Success);
                }

                if (conn.State == ConnectionState.Broken ||
                    conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                var cmd = customCommand.CreateCommand(conn, validationContext.ObjectInstance);

                var cnt = Convert.ToInt32(cmd.ExecuteScalar());

                if (cnt > 0)
                {
                    return(new ValidationResult("has already been used", new[] { validationContext.MemberName }));
                }
            }

            return(ValidationResult.Success);
        }