0

私が返す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" />コレクションには8つのアイテムしか含まれていないので、よく提案されるものではないと思います。

コンテキストからデータをフェッチするときは、次の.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; }
}
4

3 に答える 3

2

編集:
null許容オブジェクトを使用しています。これはwcfサービスでは許可されていません。
これらのメンバーの前に[IgnoreDataMember]を追加するか、問題を修正するためにそれらをnull許容にしないようにします。


クラスGradeVariantも投稿していただけますか?そのクラスには、接続をスローする特定の解析不可能な要素が予期せず閉じられた可能性があります。
いくつかの可能性は、辞書またはnull許容アイテムです。
GradeVariantsのリストが空またはnullであるため、単一のProgramRangeを使用したテストが機能する可能性があります。

試してみるのに良いヒントは、内部例外の内部例外の内部例外をチェックすることです
。行の最後に、通常、辞書を解析できないなどのメッセージが表示されます。

于 2012-04-04T14:13:35.653 に答える
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を使用しているという事実に賭けていますが、私は本当に知りません。上記の例外情報は、より多くの情報を提供するはずです。

于 2012-04-04T14:27:15.187 に答える
0

私は自分の質問に対する答えを見つけました、そしてここに行きます:

問題は、参照されたエンティティをロードするときにEntityFrameworkが作成した循環参照をWCFがシリアル化できないことでした。

この問題を解決するには、次のように入力します。

[DataContract(IsReference = true)]

モデルクラス上。

詳細については、 http://www.binaryforge-software.com/wpblog/?p=129を参照してください。

于 2012-04-16T11:20:20.697 に答える