Fluent Validation C# 集合中的唯一 ID

Fluent Validation C# Unique Id in collection

我有一个实体,它有一个嵌套集合作为 属性,我将从前端应用程序接收它。

我只想确保此集合 (ICollection ChildClassCollection) 中的每个项目在我收到的模型中都有一个唯一的 ID。

我正在使用 FluentValidation,为了保持一致性,我也想添加此验证。

这是一个非常简单的问题,我找不到优雅的方法来解决..

一个例子:

public class ParentClass
{
    public string Name { get; set; }

    public ICollection<ChildClass> ChildClassCollection { get; set; }
}

public class ChildClass
{
    public int Id { get; set; }

    public string Name { get; set; }
}

使用哈希集。 https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.hashset-1?view=netframework-4.7.2

public class ParentClass
{
    public string Name { get; set; }

    public HashSet<ChildClass> ChildClassCollection { get; set; }
}

public class ChildClass
{
    public int Id { get; set; }

    public string Name { get; set; }
}

是否只使用 fluentValidator 来实现这个没有任何关系

如果是,你可以自定义一个验证器,然后使用一些逻辑来确认是否存在重复值

在数据库中,像这样:

public class ChildClassValidator : AbstractValidator<ChildClass>
{
    private readonly MyDbContext _context;
    public ChildClassValidator(MyDbContext context)
    {
        _context = context;
        RuleFor(x => x.Id).NotEmpty().WithMessage("ID is required.").Must(IsUnique).WithMessage("parent have more than one ids");
    }

    private bool IsUnique(int id)
    {
        var model = _context.ParentClasses.GroupBy(x => x.Id)
           .Where(g => g.Count() > 1)
           .Select(y => y.Key)
           .ToList();  //judge whether parentclass has duplicate id
        if (model==null) 
            return true;
        else return false;
    }
}

这是我最后得到的: PRetty cleaned,另外,当它遇到问题时,它会退出

           this.RuleFor(or => or.ChildClassCollection)
               .Must(this.IsDistinct)
               .WithMessage("There are more than one entity with the same Id");

        public bool IsDistinct(List<UpdateRoleDTO> elements)
        {
            var encounteredIds = new HashSet<int>();

            foreach (var element in elements)
            {
                if (!encounteredIds.Contains(element.Id))
                {
                   encounteredIds.Add(element.Id);
                }
                else
                {
                    return false;
                }
            }

            return true;
       }