Я работаю с образцом приложения, используя хранилище таблиц Windows Azure. Я попытаюсь объяснить это, используя некоторый код:
//GetStudent is a service call
StudentDetails student = this.GetStudent(studentID);
Этот код возвращает мне объект StudentDetails, в котором значения PartitionKey и RowKey равны нулю, поскольку оба они не являются элементами DataMembers в моем DataContract.
//Update the student object
student.LastName = "New Last Name";
this.UpdateStudent(student);//Another service call
Мой код службы обновлений выглядит следующим образом:
context.AttachTo(StudentDataServiceContext.studentTableName, student, "*");
context.UpdateObject(student);
context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
Когда я запускаю этот код, я получаю следующую ошибку:
One of the request input is not valid
Я нашел обходной путь для решения этой проблемы и обновил код UpdateService, как показано ниже:
StudentDetails temp = (from c in context.StudentTable
where c.PartitionKey == "Student" && c.RowKey == student.ID
select c).FirstOrDefault();
//Copy each and every property from student object to temp object
temp.LastName = student.LastName;
context.UpdateObject(temp);
context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
Это прекрасно работает, и объект обновляется в хранилище таблиц.
Но нет ли лучшего способа сделать это? Почему функция AttachTo не работает в моем случае?
EDIT
Просто чтобы прояснить мой вопрос, вот мой класс StudentDetails:
[DataContract]
public class StudentDetails
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
[DataMember]
public string First Name { get; set; }
[DataMember]
public string Last Name { get; set; }
[DataMember]
public string ID { get; set; }
}
И ниже мой метод GetStudent:
BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress(RoleEnvironment.GetConfigurationSettingValue("StudentServiceURI"));
ChannelFactory<IPatientService> myChannelFactory = new ChannelFactory<IStudentService>(myBinding, myEndpoint);
IStudentService proxy = myChannelFactory.CreateChannel();
student = proxy.GetPatient(studentID);
((IClientChannel)proxy).Close();
myChannelFactory.Close();
Я чувствую, что проблема в вызове фабрики каналов моего GetStudent, в котором отсутствует что-то связанное с контекстом службы. Я просто не знаю что.