Аннотация 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, это немногослишком поздно, я уже обработал недопустимый элемент в объекте базы данных.
- Валидатор проверяет только корневой элемент, а не вложенный элемент.