我几天来一直在寻找以下问题的答案,到目前为止没有任何运气,我们非常感谢任何帮助。
免责声明:WCF和EntityFramework对我来说是新概念,但.NET,c#,Web服务,对象关系映射概念当然不是。
我使用WCF服务继承了一个带有客户端应用程序的应用程序,以检索并保存一个“物质”对象,该对象包含与“CaseNotesLog”对象的1对多关系。
客户端可以成功检索具有0,1或多个子CaseNotesLog对象的某些事项,它还可以成功保存具有添加,更新或删除的CaseNotesLog对象的事项。
到目前为止一切都那么好,但似乎有一组事项,其子CaseNotesLog对象可以成功读取,但即使它们根本没有被修改也无法保存。
基本上,当保存Matter对象时WCF上的反序列化过程会丢失子CaseNotesLog条目。
澄清:
就像在其他地方重置RelationshipManager集合一样。
最终结果是带有子CaseNotesLog对象的Matter对象在客户端留下了我的代码,但是当我检查服务器上对象的状态时它看起来正确地序列化/反序列化 - 儿童记录已经消失。
要检查我是否在entityframework类中添加了一些代码,以便独立计算子集合的大小。设置CaseNotesLog集合时,它在Set操作期间设置为1,并且在Get期间检索CaseNotesLog集合时保持为1,即使集合已清空。
增加了混乱 *这不适用于所有事项,有些似乎是别人没有做的 *这似乎不适用于其他集合似乎有效的所有类型的子对象。
WCF服务以及其他方法实现了以下内容:
[ServiceContract]
public interface IMattersService
{
...
[OperationContract]
Matter ReadMatter(int matterID);
...
[OperationContract]
void SaveMatter(Matter matter);
...
}
}
实施如下:
public class MattersService : IMattersService
{
...
public Matter ReadMatter(int matterID)
{
using (var repo = new MatterRepository())
{
try
{
return repo.ReadMatter(matterID);
}
catch (Exception ex)
{
Logger.Write(ex, "Error", 0);
throw;
}
}
}
...
public void SaveMatter(Matter matter)
{
Trace.WriteLine(matter.CaseNotesLogs.Count);
using (var repo = new MatterRepository())
{
try
{
repo.SaveMatter(matter);
}
catch (Exception ex)
{
Logger.Write(ex, "Error", 0);
throw;
}
}
}
...
}
Matter是一个EntityFramework生成的类:
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName="EDDSolutionsLtd.Services.Data", Name="Matter")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Matter : EntityObject
{
...
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("EDDSolutionsLtd.Services.Data", "MatterCaseNotesLog", "CaseNotesLog")]
public EntityCollection<CaseNotesLog> CaseNotesLogs
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CaseNotesLog>("EDDSolutionsLtd.Services.Data.MatterCaseNotesLog", "CaseNotesLog");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<CaseNotesLog>("EDDSolutionsLtd.Services.Data.MatterCaseNotesLog", "CaseNotesLog", value);
}
}
}
...
}
错误的版本我添加了一些日志记录:
public int CheckCaseNotesLogsCount { get; set; }
public EntityCollection<CaseNotesLog> CheckCaseNotesLogs { get; set; }
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("EDDSolutionsLtd.Services.Data", "MatterCaseNotesLog", "CaseNotesLog")]
public EntityCollection<CaseNotesLog> CaseNotesLogs
{
get
{
if (CheckCaseNotesLogs != null)
{
Trace.WriteLine("GET ACTUAL CheckCaseNotesLogs[" + CheckCaseNotesLogs.Count + "]");
}
Trace.WriteLine("GET ACTUAL CheckCaseNotesLogsCount[" + CheckCaseNotesLogsCount + "]");
StackTrace st = new StackTrace();
int i = ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CaseNotesLog>("EDDSolutionsLtd.Services.Data.MatterCaseNotesLog", "CaseNotesLog").Count;
Trace.WriteLine("GET ACTUAL value[" + i + "]");
Trace.WriteLine(st.ToString());
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CaseNotesLog>("EDDSolutionsLtd.Services.Data.MatterCaseNotesLog", "CaseNotesLog");
}
set
{
if ((value != null))
{
CheckCaseNotesLogs = value;
CheckCaseNotesLogsCount = value.Count;
Trace.WriteLine("SET ACTUAL value[" + value.Count + "]");
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<CaseNotesLog>("EDDSolutionsLtd.Services.Data.MatterCaseNotesLog", "CaseNotesLog", value);
Trace.WriteLine("SET ACTUAL Property value[" + this.CaseNotesLogs.Count + "]");
}
else
{
Trace.WriteLine("SET NULL Value");
}
}
}
这是Wcf服务收到的Soap消息的片段,显示存在子CaseNotesLog记录。
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2011-05-19T22:49:34.7968750Z" />
<Source Name="System.ServiceModel.MessageLogging" />
<Correlation ActivityID="{fa25d214-04e9-4b16-8ae8-3de7b9a12bc6}" />
<Execution ProcessName="WebDev.WebServer40" ProcessID="2332" ThreadID="13" />
<Channel />
<Computer>EDD-MERCURY</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<MessageLogTraceRecord Time="2011-05-19T23:49:34.7812500+01:00"
Source="ServiceLevelReceiveRequest"
Type="System.ServiceModel.Channels.BufferedMessage"
xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<HttpRequest>
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<Content-Length>142631</Content-Length>
<Content-Type>application/soap+xml;
charset=utf-8</Content-Type>
<Expect>100-continue</Expect>
<Host>localhost:58080</Host>
<VsDebuggerCausalityData>
uIDPo7kHl/h9zQNAkghvTvB5/u8AAAAAuoDOged1MUm+UmudC0H6u3k/74R6jUpIn/o2sS4KNxYACQAA</VsDebuggerCausalityData>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">
http://tempuri.org/IMattersService/SaveMatter</a:Action>
<a:MessageID>
urn:uuid:f1d751a7-1012-4268-b7da-87a12cf6d14f</a:MessageID>
<ActivityId CorrelationId="4f53460f-8880-4b6e-aa66-557fa90d4ae3"
xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">
fa25d214-04e9-4b16-8ae8-3de7b9a12bc6</ActivityId>
<a:ReplyTo>
<a:Address>
http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">
http://localhost:58080/MattersService.svc</a:To>
</s:Header>
<s:Body>
<SaveMatter xmlns="http://tempuri.org/">
<matter z:Id="i1"
xmlns:b="http://schemas.datacontract.org/2004/07/EDDSolutionsLtd.Services.Data"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<EntityKey z:Id="i2"
xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"
xmlns:c="http://schemas.datacontract.org/2004/07/System.Data">
<c:EntityContainerName>
EDDSolutionsLtdEntities</c:EntityContainerName>
<c:EntityKeyValues>
<c:EntityKeyMember>
<c:Key>ID</c:Key>
<c:Value i:type="d:int"
xmlns:d="http://www.w3.org/2001/XMLSchema">
180</c:Value>
</c:EntityKeyMember>
</c:EntityKeyValues>
<c:EntitySetName>Matters</c:EntitySetName>
</EntityKey>
<b:AllRecordsReceivedDate i:nil="true">
</b:AllRecordsReceivedDate>
<b:BeginClaimDate i:nil="true">
</b:BeginClaimDate>
...
<b:CaseEmailLogs></b:CaseEmailLogs>
<b:CaseFileLogs></b:CaseFileLogs>
<b:CaseNotesLogs>
<b:CaseNotesLog z:Id="i3">
<EntityKey z:Id="i4"
xmlns="http://schemas.datacontract.org/2004/07/System.Data.Objects.DataClasses"
xmlns:c="http://schemas.datacontract.org/2004/07/System.Data">
<c:EntityContainerName>
EDDSolutionsLtdEntities</c:EntityContainerName>
<c:EntityKeyValues>
<c:EntityKeyMember>
<c:Key>ID</c:Key>
<c:Value i:type="d:int"
xmlns:d="http://www.w3.org/2001/XMLSchema">
281</c:Value>
</c:EntityKeyMember>
</c:EntityKeyValues>
<c:EntitySetName>
CaseNotesLogs</c:EntitySetName>
</EntityKey>
<b:ActivityDate>
2011-05-18T00:00:00</b:ActivityDate>
<b:Body i:nil="true"></b:Body>
<b:Comment>3</b:Comment>
<b:ContactID>608</b:ContactID>
<b:CreatedBy>mminns</b:CreatedBy>
<b:CreatedOn>
2011-05-19T15:25:03.923</b:CreatedOn>
<b:ID>281</b:ID>
<b:MatterId>180</b:MatterId>
<b:ModifiedBy>mminns</b:ModifiedBy>
<b:ModifiedOn>
2011-05-19T15:25:03.923</b:ModifiedOn>
<b:OriginalContactID>0</b:OriginalContactID>
<b:Outcome>Unknown</b:Outcome>
<b:Subject>1</b:Subject>
</b:CaseNotesLog>
</b:CaseNotesLogs>
...
</matter>
</SaveMatter>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
答案 0 :(得分:0)
您可以为数据协定标记此属性:System.Runtime.Serialization.DataContractAttribute(IsReference = true)]