#silverlight-4.0 #entity-framework-4 #ria #wcf-ria-services #domainservices
#silverlight-4.0 #entity-framework-4 #ria #wcf-ria-services #domainservices
Вопрос:
Я использую доменные службы RIA с entity framework 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 для предоставления свойства Name для 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;
}
}
}
Если я отредактирую имя объекта и вызову 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. Я не доверяю этому решению, хотя, поскольку другие изменения могли быть внесены до возврата асинхронного вызова, и эти изменения также будут отклонены. Идеальным решением было бы проигнорировать это значение и ВООБЩЕ НЕ устанавливать
Ответ №1:
Возможно, вам потребуется немного подробнее рассказать 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. Спасибо за ввод, теги отношений ДЕЙСТВИТЕЛЬНО существуют, поскольку я использовал entity для их генерации. Я надеялся на тег противоположного типа, что-нибудь, чтобы скрыть свойства на стороне клиента от процессов ria? Начинает казаться, что такого тега на самом деле не существует…
2. Существует
[Ignore]
атрибут. Я использовал это, чтобы дать указание RIA не отображать свойство на стороне клиента.
Ответ №2:
Вот мое решение:
private bool isExpanded = false;
public bool IsExpanded
{
get { return isExpanded; }
set
{
string stack = (new System.Diagnostics.StackTrace()).ToString();
if (!stack.Contains("ObjectStateUtility.ApplyState") amp;amp; isExpanded != value)
{
isExpanded = value;
RaisePropertyChanged("IsExpanded");
}
}
}