3

WCF サービスと Entity Model を一緒に使用すると問題が発生しました。既存のデータベースからエンティティ モデルを作成しました。これは以下に示すことができます。

ここに画像の説明を入力

「Entity Object Code Generator」からのコンソール アプリケーションでクラスを使用しても問題はありません。

次に、以下のインターフェイスで WCF サービスを作成しました。

    [ServiceContract]
public interface IAuthorServices
{
    [OperationContract]
    [WebGet( UriTemplate="GetNews")]
    List<Newspaper> GetNews();

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetAuthors")]
    List<Author> GetAuthors();

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetAuthorTexts")]
    List<AuthorText> GetAuthorTexts();

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetTodaysTexts")]
    List<AuthorText> GetTodaysTexts();

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetExceptions")]
    List<KoseYazilari.Exception> GetExceptions();

}

ただし、これらのメソッドをサービス クラスに実装してクライアント アプリケーションを実行すると、次のようなエラーが発生しました。

ここに画像の説明を入力

どうすればこの問題を解決できますか?

よろしく、ケマル

4

1 に答える 1

4

エンティティはDataContract属性でマークされていますか? それらがシリアライズ可能であることを確認していますか?

編集:コードを見ると、エンティティを直接使用しているようです。(コードが機能していたとしても)Entity Frameworkが自動生成するような追加のプロパティが必要だとは思わないため、これは良い習慣ではありません。

これらの場合、DTO (データ転送オブジェクト) の使用を検討する必要があります。これは、Newspaperクラスがどのようになるかの例です。

[DataContract]
public class NewspaperDTO
{
    public NewspaperDTO(Newspaper newspaper)
    {
        this.Name = newspaper.Name;
        this.Image = newspaper.Image;
        this.Link = newspaper.Link;
        this.Encoding = newspaper.Encoding;
    }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Image { get; set; }

    [DataMember]
    public string Link { get; set; }

    [DataMember]
    public string Encoding { get; set; }
}

そして、あなたのサービスで:

public List<NewspaperDTO> GetNews()
{
    return entities.Newspapers.Select(a => new NewspaperDTO(a)).ToList();
}

PSあなたのエンティティが破棄されていないことに気付きました(WCFサービス内で意味します)。サービスのすべてのメソッドで、次のようなパターンを使用することを検討する必要があります。

public List<NewspaperDTO> GetNews()
{
    using (var entities = new MyEntities())
    {
        return entities.Newspapers.Select(a => new NewspaperDTO(a)).ToList();
    }
}
于 2011-08-23T12:58:55.503 に答える