我有一个无状态服务,它加载并返回一个实体对象数组(使用EF的POCO)。延迟加载和代理创建已禁用。
只要我只返回一个单一级别的图表,一切都运行正常:
var devices = context.Devices.Where(d => d.ParentHost_Id == hostId);
return Task.FromResult(devices.ToArray());
然而,如果我想要包含另一个级别,那么事情会以糟糕的方式向南发展:
var devices = context.Devices.Where(d => d.ParentHost_Id == hostId).Include(d => d.ConnectedDevices);
return Task.FromResult(devices.ToArray());
在这种情况下,我的代码将加载并返回请求的对象而没有任何问题,但在调用链上游的某个地方Service Fabric会抛出一个COMException,然后通过再次调用我的服务来处理它。这导致了一个新的COMExcetion,它一直这样做,直到我停止它。
{System.Runtime.InteropServices.COMException (0x80071C4C): Undantag från HRESULT: 0x80071C4C
vid Microsoft.ServiceFabric.Services.Communication.FabricTransport.Common.NativeServiceCommunication.IFabricServiceCommunicationClient.EndRequest(IFabricAsyncOperationContext context)
vid Microsoft.ServiceFabric.Services.Communication.FabricTransport.Client.NativeServiceCommunicationClient.EndRequest(IFabricAsyncOperationContext context)}
Devices类由EF生成,如下所示:
public partial class Devices
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Devices()
{
this.LogValues = new HashSet<LogValues>();
}
public long Id { get; set; }
public int DeviceId { get; set; }
public int Type { get; set; }
public string Property { get; set; }
public string Name { get; set; }
public Nullable<long> ParentHost_Id { get; set; }
public virtual Hosts Hosts { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<LogValues> LogValues { get; set; }
public virtual ConnectedDevices ConnectedDevices { get; set; }
}
对于为什么会发生这种情况的任何想法都将不胜感激!
答案 0 :(得分:1)
显然,问题是我的对象图包含一个循环引用(ConnectedDevice有一个对Device的引用)。我从EF模型中删除了它,现在一切都按预期工作了。