2014-05-01 10 views
5

Ho una tabella (tabella di collegamento) con 3 chiavi primarie così quando voglio controllare i record duplicati, devo controllare 3 proprietà insieme(Best Practice) FluentValidation e Controllo Enti duplicati

ho scritto un metodo come questo

private bool IsDuplicate(long roleId, long componentGroupId, long operationId) 
    { 
     var business = new RoleGroupBusiness(); 
     var result = business.Where(x => x.RoleID == roleId && x.ComponentGroupID == componentGroupId && x.OperationID == operationId).Any(); 
     return result; 
    } 

e ho una classe FluentValidator come questo:

public class RoleGroupValidator : AbstractValidator<RoleGroup> 
{ 

    private bool IsDuplicate(long roleId, long componentGroupId, long operationId) 
    { 
     var business = new RoleGroupBusiness(); 
     var result = business.Where(x => x.RoleID == roleId && x.ComponentGroupID == componentGroupId && x.OperationID == operationId).Any(); 
     return result; 
    } 
    public RoleGroupValidator() 
    { 
     RuleFor(x => x.RoleID).NotNull().WithMessage("A"); 
     RuleFor(x => x.ComponentGroupID).NotNull().WithMessage("A"); 
     RuleFor(x => x.OperationID).NotNull().WithMessage("A");  
    } 

} 

1) Come posso usare methid IsDuplicate in FluentValidator?

o

2) Qual è il modo migliore per il controllo di entità è duplicato o non fluentValidation Library?

RuleFor solo io ottenere il valore di una delle proprietà, ma ho bisogno del valore di tutte le proprietà per il passaggio al mio metodo

risposta

0

Questo codice non è stato testato, ma ho fatto qualcosa di simile, utilizzando un valore fittizio nel metodo che non è mai usato per niente.

private bool NotBeDuplicate(RoleGroup r, long dummy) 
{ 
    var business = new RoleGroupBusiness(); 
    var result = business.Where(x => x.RoleID == r.RoleID && x.ComponentGroupID == r.ComponentGroupID && x.OperationID == r.OperationID).Any(); 
    return !result; 
} 

public RoleGroupValidator() 
{ 
    RuleFor(x => x.RoleID).Must(NotBeDuplicate); 
} 

Speriamo che punti nella giusta direzione.

5

Si dovrebbe utilizzare il metodo deve:

public class RoleGroupValidator : AbstractValidator<RoleGroup> 
{ 
    public RoleGroupValidator() 
    { 
     RuleFor(x => x.RoleID).NotNull().WithMessage("A"); 
     RuleFor(x => x.ComponentGroupID).NotNull().WithMessage("A"); 
     RuleFor(x => x.OperationID).NotNull().WithMessage("A"); 
     RuleFor(x => x).Must(x => !IsDuplicate(x)); 
    } 

    private bool IsDuplicate(RoleGroup r) 
    { 
     var business = new RoleGroupBusiness(); 
     return business.Any(x => x.RoleID == r.RoleID && 
           x.ComponentGroupID == r.ComponentGroupID && 
           x.OperationID == r.OperationID); 
    } 
} 

Non dimenticate di smaltire esempio RoleGroupBusiness se è usa e getta (probabilmente lo è):

private bool IsDuplicate(RoleGroup r) 
{ 
    using (var business = new RoleGroupBusiness()) 
    { 
     return business.Any(x => x.RoleID == r.RoleID && 
          x.ComponentGroupID == r.ComponentGroupID && 
          x.OperationID == r.OperationID); 
    } 
}