2014-12-10 4 views
1

У меня есть Приводимый аннотированный моделируютDataServiceContext Ошибка обновления

public class TypeA 
{ 
    public int TypeAId { get; set; } 

    [Required] 
    public TypeB B { get; set; }   

    public string AValue { get; set; } 
} 


public class TypeB 
{ 
    public int TypeBId { get; set; } 

    public string BValue { get; set; } 
} 

разоблачен как v3 OData с помощью службы данных WCF с использованием фреймворка объекта. При попытке обновить TypeA используя DataServiceContext такие как

var ctx = new Service.Context(new Uri("http://localhost/TestUpdateService/TestUpdateService.svc")); 
var t = ctx.theATypes.Expand(p => p.B).First(); 
t.AValue = "New value"; 
ctx.UpdateObject(t); 
ctx.SaveChanges(); 

Я получаю DbEntityValidationException в службе с указанием «Поле B требуется»

тела запроса «Объединить/TestUpdateService/TestUpdateService. svc/theATypes (1) HTTP/1.1 " содержит изменение свойства AValue, но не содержит никакой информации о ссылке в свойство B (это мое предположение о том, почему валидация не работает в службе). Мне что-то не хватает в обновлении службы данных?

ответ

1

Я полагаю, что OData использует MERGE-глагол, который более эффективен, чем PUT (PUT требует отправки всех полей, в то время как MERGE отправляет только измененные данные), но в вашем поле модели «B» отмечено как обязательное, поэтому вы получаете исключение проверки на стороне клиента. Чтобы проверить, что это так, вы можете временно удалить атрибут [Обязательный] из поля «B» и проверить, что операция обновления завершена успешно. Если это так, у вас есть два варианта:

  • Извлеките [Обязательные] атрибуты из вашей модели на стороне клиента, чтобы включить работу MERGE;
  • Убедитесь, что значения обязательных полей заданы перед вызовом SaveChanges.
+0

удаление атрибута, конечно же, позволяет добиться успеха. однако исключение проверки происходит в службе данных, поэтому я не уверен, что понимаю, что вы подразумеваете под «удалять [требуется] из модели на стороне клиента. Также требуемые значения устанавливаются до сохранения изменений. –

0

Запрос URL должен иметь $expand=B, так что он также читает .B значения свойства, которое помогает в следующем MERGE.

var ctx = new Service.Context(new Uri("http:// localhost /TestUpdateService/TestUpdateService.svc")); 

//var t = ctx.theATypes.First(); 

var t= 

(

from s in ctx.theATypes 

select new TypeA(){AValue =s.AValue , B=s.B} 

) 
.First(); 

t.AValue = "New value"; 

ctx.UpdateObject(t); 

ctx.SaveChanges 
+0

попытался это предложение (и отредактировал мой вопрос, чтобы отразить изменение кода), но получил тот же результат. –