Риа Сервис: Навигация - PullRequest
0 голосов
/ 15 марта 2012

Например, у меня есть две сущности

Class A
{
 public Guid Id {get;set;}
 public Guid BId {get;set;}
 public B InstanceB {get;set;}
}

Class B
{
 public Guid Id {get;set}
}

B относится к A, в моем приложении Silver Light я создаю новый экземпляр A, а также новый экземпляр B. Новый экземплярБ еще не существует.Но мне нужен экземпляр B. на моем сервисе.

Могу ли я сделать это без организации или ассоциации с Ria Service?

Редактировать:

МойКласс A:

открытый частичный класс lSync {

        // Metadata classes are not meant to be instantiated.
        private lSync() {
        }

        public string ConflictMessage { get; set; }

        public DateTime DateInserted { get; set; }

        public Guid vValuesId { get; set; }

        public Guid ID { get; set; }

        public bool IsConflict { get; set; }

        public bool IsReadyToSync { get; set; }

        public Guid SyncSet { get; set; }

        public vValues vValues { get; set; }

    }

My Ria Service:

[Invoke] public lSync [] SynchvValuesFromClient (lSync [] syncs) {

        bool noConflict = true;
        foreach (lSync sync in syncs) {
            var servervValue = GetvValuesByID(sync.vValuesId).FirstOrDefault();
            var queuevValues = sync.vValues; //sync.vValues here is null, but my sync.vValuesId is not
            if (servervValue== null) {
                InsertvValues(queueValue);
            }
            else {
                if (servervValue.IsServerConflict(queueValue)) {
                    sync.IsConflict = true;
                    sync.ConflictMessage = "Conflict";
                    noConflict = false;
                    break;
                }
                if (!servervValue.AreValuesEqual(queueValue)) {
                    UpdatevValues(queueValue);
                }
            }
        }

        if (noConflict) {
            this.ObjectContext.SaveChanges();
        }
        return syncs;
    }


    public IQueryable<vValues> GetvValuesByID(Guid ID) {
        return ObjectContext.vValues.Where(t => t.ID == ID);
    }


    public void InsertvValues(vValues model) {
        model.ServerDate = DateTime.UtcNow;
        if ((model.EntityState != EntityState.Detached)) {
            this.ObjectContext.ObjectStateManager.ChangeObjectState(model, EntityState.Added);
        }
        else {
            this.ObjectContext.vValues.AddObject(model);
        }
    }


    public void UpdatevValues(vValuesmodel) {
        model.ServerDate = DateTime.UtcNow;
        this.ObjectContext.vValues.AttachAsModified(model,               this.ChangeSet.GetOriginal(model));
    }

:(

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Редактировать

Порядок неверен для вашего метода :) Создайте экземпляр службы перед созданием экземпляров сущностей.

Должно быть:

public void SyncToServer() { 
  ContextService service = new ContextService();
  var instanceA = new A(); 
  instanceA.InstanceB = new B(); 
  service.SubmitChanges(); //service.SaveChanges() for LinqToEntities
}

Вы перезагружаете после отправки, потому что только добавление атрибута [Включить] в метаданные DomainService не будет работать.Это необходимо сделать в DomainService для LinqToSql

public A GetA()
{
  DataLoadOptions dlo = new DataLoadOptions();
  dlo.LoadWith<A>(a => a.InstanceB);
  this.DataContext.LoadOptions = dlo;
  return this.DataContext.APlural.FirstOrDefault( ); //don't know the plural of A.
}

LinqToEntities:

public A GetA()
{
  return this.MyEntitiesContext.APlural.Include( "instanceB" ).FirstOrDefault( ); //don't know the plural of A.
}
0 голосов
/ 15 марта 2012
var a = new A(){
    B = new B(); //or (B)selectedItem
}

теперь a.Id и a.BId равен 0, пока вы не сохраните и не вернете сохраненный A

...