DataMember аннотации StringLength игнорируются - PullRequest
0 голосов
/ 08 июня 2018

Аннотация DataMember StringLength, похоже, игнорируется.Я получаю поврежденный элемент, преобразовываю его в объект базы данных и получаю сообщение об ошибке, когда пытаюсь его сохранить.

В следующем веб-сервисе WCF для CompanyName задано значение 200 char max со свойством [StringLength(200)].

[ServiceContract]
public interface IDataExchanger
{
    [OperationContract]
    bool SetCustomer(Customer customer);
// [...]
}

[DataContract]
public class Customer
{
    [DataMember(IsRequired = true)]
    public RequestHeader Header;

    [DataMember(IsRequired = true)]
    [StringLength(20)]
    public string ExternalId;
    [DataMember(IsRequired = true)]
    [StringLength(200)]
    public string CompanyName;
// [...]
}

. В этом тесте я отправляю 350 char CompanyName.

<soapenv:Body>
  <tem:SetCustomer>
     <!--Optional:-->
     <tem:customer>
        <wcf:CompanyName>13245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890132456789013245678901324567890</wcf:CompanyName>
        <wcf:ExternalId>132456</wcf:ExternalId>
        <wcf:Header></wcf:Header>
     </tem:customer>
  </tem:SetCustomer>

И получите эту ошибку:

System.Data.Entity.Validation.DbEntityValidationException : 'Validation failed for one or more entities.  
See 'EntityValidationErrors' property for more details.'  

   à System.Data.Entity.Internal.InternalContext.SaveChanges()    
   à FooBar.Bdd.Repository`1.Save() dans Repository.cs:ligne 58    
   à FooBar.Service.DataExchanger.SetCustomer(Customer customer) dans DataExchangerWCF.cs:ligne 60  
   à SyncInvokeSetCustomer(Object , Object[] , Object[] )  
   à System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)  
   à System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 

Сущность Db соответствует требованию:

public class CustomerDlo
{
    [Key]
    public int Id { get; set; }

    [MaxLength(20)]
    public string ExternalId { get; set; }

    [MaxLength(200)]
    public string CompanyName { get; set; }
// [...]
}

Попытка решить проблему:

Исходя из этого Итак, ответ , я пытаюсь использовать этот метод для проверки объекта.Использование:

var vc = new ValidationContext(myObject, null, null);
var valid = Validator.TryValidateObject(myObject, vc, null, true);

В:

public class DataExchanger : IDataExchanger
{        
    public bool SetCustomer(Customer customer)
    {
        {// DataContract Validation
            var vc = new ValidationContext(customer, null, null);
            var result = Validator.TryValidateObject(customer, vc, null, true);             
            // Result is everything is ok, Not Expected!!
        }

        bool result = false;
        CustomerDlo _customer = new CustomerDlo();

        try
        {
            _customer = customer.ToDLO();
            var repo = new Repository<CustomerDlo>();

            {// DB Object validation                
                var vc = new ValidationContext(_customer, null, null);
                var result = Validator.TryValidateObject(_customer, vc, null, true);                
                // Result is Not ok! it's expected result.
            }

            repo.Insert(_customer);
            result = repo.Save();
        }
    // [...]
    }
// [...]
}

У меня возникла следующая проблема:

  • Validator работает на DbObject, но не на Datacontract, это немногослишком поздно, я уже обработал недопустимый элемент в объекте базы данных.
  • Валидатор проверяет только корневой элемент, а не вложенный элемент.
...