当我返回IEnumerable<ProgramRange>
时会抛出异常:
基础连接已关闭:连接意外关闭。
ProgramRange类看起来像这样:
[DataContract]
public partial class ProgramRange
{
public ProgramRange()
{
this.GradeVariants = new HashSet<GradeVariant>();
}
[DataMember]
public int ID { get; set; }
[DataMember]
public int Range { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public virtual ICollection<GradeVariant> GradeVariants { get; set; }
}
该集合仅包含八个项目,因此我认为这不是经常建议的<dataContractSerializer maxItemsInObjectGraph="2147483647" />
。
当我从上下文中获取数据时,我会.ToList()
,所以不能那样:
public IEnumerable<ProgramRange> GetAll()
{
using (Entities dbContext = new Entities())
{
return dbContext.ProgramRanges.ToList();
}
}
我尝试将ProgramRange类添加到实现中已知类型的服务中:
[ServiceBehavior]
[ServiceKnownType(typeof(ProgramRange))]
public class ValidationService : IValidationService
我尝试过其他几件事只是为了测试:ProgramRange
(有效),IEnumerable<string>
(有效),List<ProgramRange>
(无效)
我知道stackowerflow上有关于这个主题的几个问题,我尝试了很多建议,但我无法让它工作。
修改
这是GradeVariant类:
[DataContract]
public partial class GradeVariant
{
public GradeVariant()
{
this.GradeVariantRules = new HashSet<GradeVariantRule>();
}
[DataMember]
public int ID { get; set; }
[DataMember]
public int GradeTypeID { get; set; }
[DataMember]
public int ProgramRangeID { get; set; }
[DataMember]
public Nullable<int> ProgramID { get; set; }
[DataMember]
public Nullable<int> ApprenticeID { get; set; }
[DataMember]
public Nullable<int> Prefix { get; set; }
[DataMember]
public Nullable<bool> IV { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public virtual GradeType GradeType { get; set; }
[DataMember]
public virtual ProgramRange ProgramRange { get; set; }
[DataMember]
public virtual ICollection<GradeVariantRule> GradeVariantRules { get; set; }
}
答案 0 :(得分:2)
编辑:
您正在使用可以为空的对象,这在wcf服务中是不允许的
在这些成员面前添加[IgnoreDataMember]或使其不可为空以修复您的问题。
你也可以发布GradeVariant类吗?可能在该类中存在某些不可解析的元素,这些元素意外地关闭了连接
一些可能性是字典或可以为空的项目
使用单个ProgramRange进行测试可能会起作用,因为GradeVariants列表为空或为空
尝试的一个好建议是检查内部异常的内部异常的内部异常....
在行的末尾,它通常表示无法解析词典。
答案 1 :(得分:0)
如果是序列化(可能是序列化),请直接尝试以查看是否可以找到问题:
try
{
MemoryStream tempWrite = new MemoryStream();
DataContractSerializer ds = new DataContractSerializer(typeof(ProgramRange));
ds.WriteObject(myProgramRangeInstance, tempWrite);
MemoryStream tempRead = new MemoryStream(tempWrite.GetBuffer());
ProgramRange newInstance = (ProgramRange)ds.ReadObject(tempRead);
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
尝试使用myProgramRangeInstance
作为您班级的有效实例开始。那将告诉你它是否是一个序列化问题,以及究竟是什么导致它。
现在,我打赌你正在使用HashSet,但我真的不知道。上述异常信息应提供更多信息。
答案 2 :(得分:0)
我找到了自己问题的答案,接下来就是:
问题是WCF无法序列化实体框架在加载引用实体时创建的循环引用。
要解决此问题,只需输入
即可[DataContract(IsReference = true)]
在模型类上。