Service Fabric无状态服务返回POCO对象图时的COMException

时间:2016-08-10 08:52:15

标签: c# entity-framework azure-service-fabric

我有一个无状态服务,它加载并返回一个实体对象数组(使用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; }
}

对于为什么会发生这种情况的任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

显然,问题是我的对象图包含一个循环引用(ConnectedDevice有一个对Device的引用)。我从EF模型中删除了它,现在一切都按预期工作了。