Служба домена ria устанавливает свойство на стороне клиента при обратном вызове - PullRequest
2 голосов
/ 03 июня 2011

Я использую доменные службы RIA, с структурой сущностей 4 и silverlight 4. Когда я сохраняю изменения, когда возвращается вызов службы, вызываются некоторые функции доменной службы, которые устанавливают значение "", которое вообще не должно изменяться.

У меня есть две сущности

service.metadata.cs:

public partial class EntityA
{
    [Key]
    public Guid EntityA_Id { get; set; }

    public string Name { get; set; }

    public int EntityB_Id { get; set; }

    [Include]
    public EntityB entityB { get; set; }

}
public partial class EntityB
{
    [Required]
    public string Name { get; set; }

    public int EntityB_Id { get; set; }

    public EntityCollection<EntityA> entityA { get; set; }
}

На стороне клиента у меня есть свойство Extra для EntityA, чтобы раскрыть свойство Name od EntityB,Серверной стороне и доменной службе никогда не нужно знать об этом свойстве, оно предназначено только для графического интерфейса.

public partial class EntityA
{
    //Tags I have tried:
    //[IgnoreDataMember]
    //[XmlIgnore]
    //[Ignore]
    //[Exclude]
    public string NameOf_EntityB
    {
        get
        {
            return this.entityB == null ? string.Empty : this.entityB.Name;
        }
        set
        {
            this.entityB.Name = value;
        }
    }
}

Если я изменяю имя entityA и вызываю serviceContext.SubmitChanges (), когда вызов возвращает некоторый процесс службы доменаустанавливает EntityA.NameOf_EntityB = ""; Итак, с точки зрения пользователя, они сохраняют одно значение, а другое сбрасывает.

Мне нужно, чтобы это не происходило.Я пробовал различные атрибуты данных, но они либо не работают на стороне клиента, либо не оказывают никакого влияния.

Есть идеи, что сделать, чтобы служба домена не изменила это значение?

вот стэк вызовов перед изменением значения:

System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.ObjectStateUtility.**ApplyValue**(object o, object value, System.Reflection.PropertyInfo propertyInfo, System.Collections.Generic.IDictionary<string,object> originalState, System.ServiceModel.DomainServices.Client.LoadBehavior loadBehavior) + 0x74 bytes   
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.ObjectStateUtility.ApplyState(object o, System.Collections.Generic.IDictionary<string,object> stateToApply, System.Collections.Generic.IDictionary<string,object> originalState, System.ServiceModel.DomainServices.Client.LoadBehavior loadBehavior) + 0x330 bytes 
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.Entity.ApplyState(System.Collections.Generic.IDictionary<string,object> entityStateToApply, System.ServiceModel.DomainServices.Client.LoadBehavior loadBehavior) + 0x68 bytes   
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.Entity.Merge(System.ServiceModel.DomainServices.Client.Entity otherEntity, System.ServiceModel.DomainServices.Client.LoadBehavior loadBehavior) + 0x5a bytes    
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.DomainContext.ApplyMemberSynchronizations(System.Collections.Generic.IEnumerable<System.ServiceModel.DomainServices.Client.ChangeSetEntry> changeSetResults) + 0x10e bytes  
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.DomainContext.ProcessSubmitResults(System.ServiceModel.DomainServices.Client.EntityChangeSet changeSet, System.Collections.Generic.IEnumerable<System.ServiceModel.DomainServices.Client.ChangeSetEntry> changeSetResults) + 0x262 bytes    
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.DomainContext.CompleteSubmitChanges(System.IAsyncResult asyncResult) + 0x1cb bytes  
System.ServiceModel.DomainServices.Client!System.ServiceModel.DomainServices.Client.DomainContext.SubmitChanges.AnonymousMethod__5() + 0x2e bytes   

Редактировать: нашел обходной путь на данный момент.В обратном вызове вызова ServiceContext.submitChanges () я могу вызвать ServiceContext.RejectChanges (), чтобы отменить изменение, внесенное в EntityB.Я не доверяю этому решению, так как другие изменения могли быть сделаны до того, как асинхронный вызов вернется, и эти изменения также будут отклонены.Идеальным решением было бы игнорировать это значение и НЕ устанавливать его вообще

Ответы [ 2 ]

0 голосов
/ 22 июня 2015

Вот мое решение:

private bool isExpanded = false;

public bool IsExpanded
{
    get { return isExpanded; }
    set
    {
        string stack = (new System.Diagnostics.StackTrace()).ToString();
        if (!stack.Contains("ObjectStateUtility.ApplyState") && isExpanded != value)
        {
            isExpanded = value;
            RaisePropertyChanged("IsExpanded");
        }
    }
}
0 голосов
/ 04 июня 2011

Возможно, вам понадобится рассказать WCF RIA немного больше о ваших сущностях с некоторыми атрибутами:

public partial class EntityA
{
    [Key]
    public Guid EntityA_Id { get; set; }

    public string Name { get; set; }

    public int EntityB_Id { get; set; }

    [Include]
    [Association("EntityA-EntityB", "EntityA_Id", "EntityB_Id", IsForeignKey=false)]
    public EntityB entityB { get; set; }

}

public partial class EntityB
{
    [Required]
    public string Name { get; set; }

    [Key]
    public int EntityB_Id { get; set; }

    public Guid EntityA_Id { get; set; }

    [Include]
    [Association("EntityA-EntityB", "EntityA_Id", "EntityB_Id", IsForeignKey=true)]
    public EntityCollection<EntityA> entityA { get; set; }
}
...