2012-01-17 35 views
5

Khi tôi chạy dịch vụ của mình, tôi có ngoại lệ:Sê-ri POCO tuần tự hóa với WCF

Máy chủ gặp lỗi khi xử lý yêu cầu. Thông báo ngoại lệ là 'Không thể tuần tự hóa tham số của kiểu System.Data.Entity.DynamicProxies.Cosik_14C2 ...' (cho hoạt động 'GetCosik', hợp đồng 'ICosikService') bởi vì nó không phải là loại chính xác 'Project.Domain.Entities.Cosik 'trong chữ ký phương thức và không có trong bộ sưu tập kiểu đã biết. Để tuần tự hóa tham số, hãy thêm loại vào bộ sưu tập kiểu đã biết cho hoạt động bằng ServiceKnownTypeAttribute. '. Xem nhật ký máy chủ để biết thêm chi tiết.

Tôi mới tham gia các dịch vụ WCF và Khung thực thể và tôi đánh giá cao mọi trợ giúp/đề xuất.

Tôi đang sử dụng Khung thực thể 4.1. Sử dụng mã đầu tiên tôi tạo cơ sở dữ liệu với hai bảng:

[DataContract(IsReference=true)] 
public class Cosik 
{ 
    [DataMember] 
    public int cosikID { get; set; } 

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

    [DataMember] 
    public int DifficultyID { get; set; } 
    [DataMember] 
    public virtual Difficulty Difficulty { get; set; } 
} 

[DataContract(IsReference=true)] 
public class Difficulty 
{ 
    [DataMember] 
    public int DifficultyID { get; set; } 

    [DataMember] 
    [Required] 
    public string NameToDisplay { get; set; } 
} 

Tiếp theo tôi đã tạo ứng dụng dịch vụ WCF và làm cho nó yên tĩnh. Dưới đây là mã cho giao diện:

[ServiceContract] 
public interface ICosikService 
{ 
    [OperationContract] 
    [ApplyDataContractResolver] 
    [WebGet(UriTemplate = "/cosik")] 
    Cosik GetCosik(); 
} 

và thực hiện các hợp đồng mà

public class RecipeService : IRecipeService 
{ 
//repository of Cosik entities - stores collection of all 
//Cosik entities that can be queried from DB 
private ICosikRepository cosikRepo; 
... 

public Cosik GetCosik() 
    { 
     Cosik c = cosikRepo.GetById(1); 
     return c; 
    } 

tôi thực hiện lớp ApplyDataContractResolverAttribute nhất định trên: http://msdn.microsoft.com/en-us/library/ee705457.aspx và thêm [ApplyDataContractResolver] chú thích phương pháp GetCosik. Tuy nhiên, nó không giúp được gì.

Bất kỳ đề xuất nào tôi đã bỏ lỡ?

+0

Dường như * Cosik * đi vào hoạt động dịch vụ của bạn GetCosik() và mà bạn đã đánh dấu vì hợp đồng dữ liệu không giống * Cosik * như được định nghĩa trong mô hình tổ chức của bạn và dịch vụ của bạn là vì lý do nào đó cố gắng trả lại. –

+0

Bạn vẫn nhận được cùng một lỗi nếu bạn vô hiệu hóa tải chậm trong [ObjectContext] của bạn (http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx) bằng cách sử dụng 'ngữ cảnh. ContextOptions.LazyLoadingEnabled = false'? –

+0

Bạn có thể thêm [KnownType (Cosik)] vào lớp RecipeService của bạn không. – Rajesh

Trả lời

4

Thay vì phát triển trình giải quyết tùy chỉnh sẽ tắt tạo proxy. Proxy không cho các kịch bản như WCF vì lười tải phải được tắt nào trong serialization và theo dõi sự thay đổi năng động là không bao giờ được sử dụng:

context.Configuration.ProxyCreationEnabled = false; 
+0

Bằng cách tắt proxy, tất cả các đối tượng ảo của tôi (trường) trở thành rỗng và tôi mất chức năng do EF cung cấp. Tôi tự hỏi nếu đó là thực sự là trường hợp mà tôi phải truy vấn cơ sở dữ liệu để thiết lập các lĩnh vực ảo với các dữ liệu thích hợp trên của riêng tôi. Tôi đã đi qua rất nhiều trang giải thích cách sử dụng wcf với các ví dụ đơn giản cho dữ liệu đơn giản nhưng dữ liệu đơn giản khá khan hiếm trong thế giới thực. Bất cứ ai có thể chỉ cho tôi một số tài nguyên/hướng dẫn giải thích làm thế nào để sử dụng phần còn lại wcf với EF trên dữ liệu phức tạp hơn? Bây giờ tôi sử dụng wcf (không nghỉ ngơi) và nó hoạt động nhưng tôi muốn tìm hiểu cách sử dụng nó theo cách còn lại – anetafr

+0

Các trường ảo của bạn là rỗng vì bạn không sử dụng tải mong muốn. Sử dụng tải chậm trong các tình huống mà bạn biết rằng bạn sẽ cần dữ liệu đó là không chính xác vì EF phải tạo vòng tròn cơ sở dữ liệu riêng cho "mọi thuộc tính". –

+0

@anetafr Để có hỗ trợ REST tốt hơn, hãy xem loại mục dự án 'WCF Data Service', có thể được sử dụng với mã đầu tiên, mặc dù nó có các rào cản riêng (http://blogs.msdn.com/b/writingdata_services /archive/2011/06/15/entity-framework-4-1-code-first-and-wcf-data-services.aspx). Cá nhân tôi muốn lựa chọn cho các tùy chọn sạch hơn của dịch giữa các thực thể và DTO trong lớp dịch vụ của tôi. Dù sao, một vài lựa chọn khác để bạn suy nghĩ về .. – kallotec

Các vấn đề liên quan