Как сгенерированный сервером первичный ключ возвращается клиенту RIA - PullRequest
0 голосов
/ 23 ноября 2011

Я использую слабую связь между презентацией и объектами моего домена.Когда клиент вызывает SubmitChanges, он правильно вызывает мой метод вставки на сервере, передавая экземпляр «представляемой для добавления» модели презентации.

Код на стороне сервера выполняет вставку, включая генерацию первичного ключа.Но как мне передать этот первичный ключ обратно клиенту?

Обновление: в ответ на комментарий позвольте мне дать более подробную информацию: да, я использую службу RIA, но объекты, которыми обменивается служба службы RIAс клиентом не совпадают с сущностями, которые идут в базу данных.Поэтому я не могу отдохнуть за кулисами на стороне сервера.Моя сигнатура метода вставки выглядит так:

public void InsertPerson(PersonInfo source)
{


}

Класс PersonInfo выглядит так:

public class PersonInfo
{
    [Key]
    public Guid Id { get; set; }
    public String Name { get; set; }
    // you get the point
}

В процессе вставки определяется первичный ключ (на стороне сервера) На стороне клиентаочевидно, нужна эта информация, как она получается?

Ответы [ 4 ]

2 голосов
/ 26 ноября 2011

@ GarethOwen Даже с объектами POCO значения id, если они установлены в объекте POCO внутри службы, должны обновляться на клиенте. Обычно, хотя вы не устанавливаете POCO ID, если вы не используете Guid. Поэтому, если вы используете int для идентификатора, вы можете сделать это следующим образом.

public void InsertPOCO(POCOObj POCO)
{
   RealObj x = new RealObj();

   x.Info = ...(information)...;

   this.DataContext.RealObjs.InsertOnSubmit(RealObj);

   this.DataContext.SubmitChanges();

   // Once the Submit Changes has run, the x object will then have an id value associated with it, and you can now assign the ID value of the POCO Object
   POCO.Id = x.Id;
}

И тогда вам не нужно повторно запрашивать у службы домена значение Id.

0 голосов
/ 24 ноября 2011

Rody верен, пока вы устанавливаете значение Id вашего объекта PersonalInfo на стороне сервера, этот объект будет затем обновляться на клиенте после завершения отправки изменений. Вы пытаетесь получить доступ к значению Id за пределами обратного вызова при внесении изменений? Я предполагаю, что это асинхронный запрос?

0 голосов
/ 25 ноября 2011

У нас похожая слабо связанная архитектура.Наш DomainService работает с POCO, разработанными специально для взаимодействия сервер-клиент, поэтому наш уровень постоянства хорошо скрыт от наших клиентов (Silverlight и HTML5).

Насколько мне известно, на стороне сервера генерируется IDне отправляется обратно клиенту.Мы делаем еще один запрос, чтобы снова получить объекты.

Буду признателен, если это не нужно.

Посмотрите другие ответы - возможно, - я кое-что узнал с этимвопрос и может улучшить наш код из-за этого.

0 голосов
/ 23 ноября 2011

Из ваших тегов я предполагаю, что вы используете RIA Services.Если вы сопоставили свои сущности, включая идентификаторы таблиц, вы просто вернули вставленную идентичность обратно в тот же объект на стороне клиента.

Как в следующем примере кода (скопировано из другого вопроса)здесь на SO):

MyEntity ent = new MyEntity(); //entity that has Id, mapped 
//from primary key (Identity) from data base

MyDataContext.MyEntities.Add(ent);
MyDataContext.SubmitChanges(op => { 
  if (!op.HasError) MessageBox.Show(ent.Id.ToString()); 
});
...