Обновление отключенного объекта в хранилище таблиц Azure - PullRequest
0 голосов
/ 14 декабря 2011

Я работаю с образцом приложения, используя хранилище таблиц 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, в котором отсутствует что-то связанное с контекстом службы. Я просто не знаю что.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Вы сказали, что возвращенный объект Student не имеет PartitionKey и RowKey, установленных при его возврате.Затем вы пытаетесь обновить этот объект.Если вы не установили PartitionKey и RowKey самостоятельно перед вызовом .Update(), это не удастся, поскольку базовый REST API зависит от них.

0 голосов
/ 14 декабря 2011

Это происходит при тестировании приложения с пустыми таблицами в хранилище разработки. Это связано с тем, что в настоящее время для разработки хранилища требуется, чтобы схема для сущности, хранящейся в таблице, была предварительно определена до того, как вам будет разрешено ее запрашивать.

Обход

Обходной путь прост, нам просто нужно вставить, а затем удалить фиктивную строку в таблицах Windows Azure, если приложение работает в среде разработки. Во время инициализации веб-роли целесообразно проверить, работает ли приложение с локальным хранилищем разработки, и в этом случае оно добавляет, а затем удаляет фиктивную запись в таблицах Windows Azure приложения ( Это будет сделано только в первый раз для каждой организации при работе с хранилищем разработки.

Этот код можно добавить, например, с помощью метода расширения.

Подробнее о:

http://msdn.microsoft.com/en-us/library/ff803365.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...