Ria服务:导航属性为空

时间:2012-03-15 10:57:15

标签: silverlight wcf-ria-services

例如,我有两个实体

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相关,在我的银灯应用程序中,我正在创建A的新实例,以及B的新实例.B的新实例尚不存在。但我需要服务上的B实例。

我可以在没有实体或与Ria服务协会的情况下这样做吗?

修改

我的A级:

public partial class 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; }

    }

我的Ria服务:

[调用]  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 :(得分:0)

var a = new A(){
    B = new B(); //or (B)selectedItem
}

现在a.Id和a.BId为0,直到你SaveChanged并返回已保存的A

答案 1 :(得分:0)

修改

你的方法的顺序错了:) 在创建实体实例之前创建服务实例。

应该是:

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

您是否在提交后重新加载,因为只在DomainService MetaData中添加[Include]属性将不起作用。您需要在LinqToSql的DomainService中执行此操作

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.
}