Как вставить 2 новых связанных DTO, используя RIA Service? - PullRequest
0 голосов
/ 24 августа 2011

Я использую Сервис RIA в нашем приложении Silverlight. Объекты базы данных напрямую не предоставляются клиенту, но у меня есть набор классов POCO для него. Затем в методах CRUD для этих классов POCO они преобразуются в объекты базы данных и сохраняются в базе данных. Проблема возникает на стороне сервера, когда клиент создает 2 новых объекта POCO, которые связаны между собой. Метод вставки вызывается на сервере для каждого объекта POCO отдельно, и я могу создать соответствующие новые объекты базы данных и добавить их в контекст объекта. Но я не вижу способа добавить связь между этими созданными объектами базы данных. Есть ли решение для этого?

Например, у меня есть эти 2 сущности POCO (упрощенно):

[DataContract(IsReference = true)]
public partial class Process
{
    [DataMember]
    [Key]
    public string Name
    {
       get; set;
    }

    [DataMember]
    public long StepId
    {
       get; set;
    }

    [DataMember]
    [Association("StepProcess", "StepId", "Id", IsForeignKey=true)]
    public Step Step
    {
       get; set;
    }
}

[DataContract(IsReference = true)]
public partial class Step
{
    [DataMember]
    [Key]
    public long Id
    {
       get; set;
    }

    [DataMember]
    public string Name
    {
       get; set;
    }
}

И у меня есть эти 2 метода вставки в классе обслуживания моего домена:

public void InsertProcess(Process process)
{
    var dbProcess = new DBProcess();
    dbProcess.Name = process.Name;
    //dbProcess.StepId = process.StepId;  Cannot do that!
    this.ObjectContext.AddToDBProcess(dbProcess);
}

public void InsertStep(Step step)
{
    var dbStep = new DBStep();
    dbStep.Name = step.Name;
    this.ObjectContext.AddToDBSteps(dbStep);

    this.ChangeSet.Associate<Step, DBStep>
            (step, dbStep, (dto, entity) =>
            {
                dto.Id = entity.Id;
            });
}

Клиент добавляет новый процесс, затем создает и добавляет новый шаг к нему, а затем вызывает метод SubmitChanges (). Process.StepId не заполнен с правильным значением, так как еще нет правильного Step.Id для вновь созданного шага, поэтому я не могу просто скопировать это значение в объект базы данных. Таким образом, вопрос заключается в том, как воссоздать отношения между вновь созданными объектами базы данных так же, как и во вновь создаваемых DTO?

Я знаю об атрибуте Composition, но он нам не подходит. И Процесс, и Шаг являются независимыми объектами (то есть шаги могут существовать без процесса).

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

Спасибо, хотя оба эти предложения верны, но они также применимы только для простых и небольших иерархий объектов, но не в моем случае. Я заканчиваю тем, что использую подход, подобный this . То есть У меня есть POCO к карте объектов базы данных. Если и Process, и Step являются новыми, в методе InsertProcess process.Step навигационное свойство заполняется этим новым шагом (в противном случае можно использовать StepId, так как он ссылается на существующий шаг). Поэтому, если этот process.Step находится на карте, я просто заполняю соответствующее свойство навигации в DBProcess, в противном случае я создаю новый экземпляр DBStep, помещаю его на карту и затем устанавливаю его в свойство навигации DBProcess.Step. Этот новый пустой DBStep будет заполнен методом InsertStep позже.

0 голосов
/ 25 августа 2011

Есть два способа решить эту проблему:

  1. Пусть каждый вызов возвращает первичный ключ для элемента после его создания, затем вы можете сохранить полученный PKey в другом POCO дляпозвоните во вторую службу.

  2. Создайте метод Service, который принимает оба POCO в качестве параметров и выполняет их связь для вас.

...