WCF + EF 4.1 Eager加载和序列化问题

时间:2011-09-27 08:53:36

标签: c# wcf entity-framework serialization entity-framework-4.1

OperationContract实现的简单案例:

public List<Directory> GetDirectories(bool includeFiles)
{
    if (includeFiles)
    {
        return this.db.Directories.Include(e => e.Files).ToList();
    }
    else
    {
        return this.db.Directories.ToList();
    }
}

其中GetDirectories(false);完全正常,GetDirectories(true);会抛出CommunicationObjectFaultedException消息:

  

通信对象System.ServiceModel.Channels.ServiceChannel,   不能用于通信,因为它处于Faulted状态。

显然,我的File实体引用了Directory个实体,Directory个实体有一个文件列表。首先,我认为这将是典型的循环引用陷阱,但我在异常消息中没有得到它的迹象。关于这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

这将是循环引用陷阱(here是关于此主题的内容)并且CommunicationObjectFaultedException的原因将类似于:

using (var client = new ServiceClient())
{
    data = client.GetDirectories(true);
}

原因是未处理的异常导致频道出现故障,而using正试图在该故障频道上调用Close - 它是在频道状态机中无效转换(以及一个大的WCF陌生感)导致它你提到的例外。有许多方法可以避免它,但基础是:

ServiceClient client = null;

try
{
    client = new ServiceClient();
    data = client.GetDirectories(true);
}
finally
{
    if (client != null)
    {
        if (client.State == CommunicationState.Faulted) 
        {
            client.Abort();
        } 
        else 
        {
            client.Close();
        }
    }
}