ria域服务正在回调时设置客户端属性

时间:2011-06-03 13:29:11

标签: silverlight-4.0 entity-framework-4 ria wcf-ria-services domainservices

我正在使用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; }
}

在客户端,我在EntityA上有一个Extra属性来公开EntityB的Name属性。服务器端和域服务永远不需要知道这个属性,它只用于GUI。

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 =“”; 因此,从用户的角度来看,他们会保存一个值而另一个空白。

我需要阻止这种情况发生。我尝试了各种数据属性,但它们要么在客户端不起作用,要么没有效果。

知道如何阻止域名服务更改此值?

这是改变值之前的callstack:

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 :(得分:0)

您可能需要告诉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; }
}

答案 1 :(得分:0)

这是我的解决方案:

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");
        }
    }
}