2011-09-21 17 views
12

Tôi có một lớp như hình dưới đâyLàm thế nào để sắp đặt từng loại tài sản của ICollection <T> khi sử dụng Entity Framework

public class Survey 
    { 
     public Survey() 
     { 
      SurveyResponses=new List<SurveyResponse>(); 
     } 

     [Key] 
     public Guid SurveyId { get; set; } 
     public string SurveyName { get; set; } 
     public string SurveyDescription { get; set; } 
     public virtual ICollection<Question> Questions { get; set; } 
     public virtual ICollection<SurveyResponse> SurveyResponses { get; set; } 
    } 

Đoạn mã trên mang lại cho tôi sau ngoại lệ

Không thể serialize viên 'SurveyGenerator.Survey. Câu hỏi 'loại ' System.Collections.Generic.ICollection

Khi tôi chuyển đổi ICollection vào danh sách nó serializes đúng

Kể từ khi nó được POCO của Entity Framework, tôi có thể không chuyển đổi ICollection vào danh sách

+0

Kiểm tra xem câu trả lời sẽ giúp bạn http: // stackoverflow.com/a/21660262/1488939 –

+0

Điều gì xảy ra nếu bạn sử dụng Danh sách thay vì ICollection bằng Mã EF trước? Tôi đã bị ấn tượng vì nó vẫn hoạt động. – CDeutsch

Trả lời

2

Từ vẻ của lớp học của bạn các thuộc tính ICollection được xác định mối quan hệ chính nước ngoài? Nếu vậy, bạn sẽ không muốn công khai phơi bày các bộ sưu tập.

Ví dụ: Nếu bạn đang theo dõi hướng dẫn thực hành tốt nhất cho việc phát triển Entity Framework mô hình, sau đó bạn sẽ có một lớp riêng biệt gọi là "Câu hỏi" mà sẽ dây lên lớp hai bạn với nhau mà có thể trông giống như sau:

public class Question 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 

    public virtual Survey Survey { get; set; } 
} 

Nếu đây là trường hợp, bạn có thể hoàn toàn có thể đi vòng quanh trong vòng tròn gọi Câu hỏi -> Khảo sát -> ICollection -> Câu hỏi

tôi đã có một sự cố tương tự như sử dụng EF, MVC3 để thực hiện một dịch vụ REST và couldn 't serialize ICollection <> đối tượng sau đó nhận ra tôi không cần phải như tôi sẽ được gọi đối tượng một cách riêng biệt anyway.

Lớp cập nhật cho các mục đích của bạn sẽ trông như thế này:

public class Survey 
{ 
    public Survey() 
    { 
     SurveyResponses=new List<SurveyResponse>(); 
    } 

    [Key] 
    public Guid SurveyId { get; set; } 
    public string SurveyName { get; set; } 
    public string SurveyDescription { get; set; } 

    [XmlIgnore] 
    [IgnoreDataMember] 
    public virtual ICollection<Question> Questions { get; set; } 

    [XmlIgnore] 
    [IgnoreDataMember] 
    public virtual ICollection<SurveyResponse> SurveyResponses { get; set; } 
} 

Tôi hy vọng điều này giúp bạn ra ngoài.

+1

Bài viết này đã cho tôi kết hợp với câu trả lời này http://geekswithblogs.net/danemorgridge/archive/2010/05/04/entity-framework-4-wcf-amp-lazy-loading-tip.aspx –

1

Thay đổi ICollection <T> vào một danh sách <T>

public class Survey 
{ 
    public Survey() 
    { 
     SurveyResponses=new List<SurveyResponse>(); 
    } 

    [Key] 
    public Guid SurveyId { get; set; } 
    public string SurveyName { get; set; } 
    public string SurveyDescription { get; set; } 
    public virtual List<Question> Questions { get; set; } 
    public virtual List<SurveyResponse> SurveyResponses { get; set; } 
} 
1

Nếu bạn không nhớ thêm một tham chiếu đến System.Runtime.Serialization lắp ráp, bạn có thể sử dụng mã này sẽ tuần tự hóa một đối tượng với ICollection mà không cần thay đổi việc thực hiện của đối tượng. Đoạn mã dưới đây xuất ra chuỗi. Bạn có thể sử dụng luồng tuy nhiên bạn muốn.

private string ConvertClassToXMLString<T>(T classObject) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      var serializer = new DataContractSerializer(classObject.GetType()); 
      serializer.WriteObject(stream, classObject); 

      return Encoding.UTF8.GetString(stream.ToArray()); 
     } 
    } 
0

Tôi đã sử dụng giải pháp Matthew Merryfull và nó hoạt động.

Vì tôi đang sử dụng nhà thiết kế EF để tạo thực thể mỗi khi tôi cập nhật mô hình của mình, tôi sẽ mất các thay đổi thủ công. Tôi đã phải thay đổi * .tt được sử dụng để tạo ra các mô hình. Tôi sửa vài dòng:

public string NavigationProperty(NavigationProperty navigationProperty) 
{ 
var enbleWebService = string.Empty; 
if(navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many){ 
enbleWebService = string.Format("[XmlIgnore]{0}[IgnoreDataMember]{0}", Environment.NewLine); 
} 
    var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()); 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{5} {0} {1} {2} {{ {3}get; {4}set; }}", 
     AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)), 
     navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 
     _code.Escape(navigationProperty), 
     _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(navigationProperty)), 
     _code.Escape(enbleWebService)); 
} 

public string NavigationProperty(NavigationProperty navigationProperty) 
{ 
var enbleWebService = string.Empty; 
if(navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many){ 
    enbleWebService = string.Format("[XmlIgnore]{0}[IgnoreDataMember]{0}", Environment.NewLine); 
} 
    var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType()); 
    return string.Format(
     CultureInfo.InvariantCulture, 
     "{5} {0} {1} {2} {{ {3}get; {4}set; }}", 
     AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)), 
     navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, 
     _code.Escape(navigationProperty), 
     _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), 
     _code.SpaceAfter(Accessibility.ForSetter(navigationProperty)), 
     _code.Escape(enbleWebService)); 
} 

Ngoài ra kiểm tra bài viết này trong trường hợp bạn gặp vấn đề với serialization http://geekswithblogs.net/danemorgridge/archive/2010/05/04/entity-framework-4-wcf-amp-lazy-loading-tip.aspx

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