2012-07-30 43 views
5

Tôi có một mô hình nhưEntity Framework Navigation Thuộc tính lặp vấn đề mặc dù WCF

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    public virtual ICollection<Group> Memberships { get; set; } 
} 

public class Group 
{ 
    [Key] 
    public long GroupId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual ICollection<User> Members { get; set; } 
} 

public class DataContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Group> Groups { get; set; } 

    public DataContext() 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
     .HasMany(u => u.Memberships) 
     .WithMany(t => t.Members) 
     .Map(x => 
     { 
      x.MapLeftKey("UserId"); 
      x.MapRightKey("GroupId"); 
      x.ToTable("GroupMembers"); 
     }); 
    } 
} 

Tất cả diễn ra tốt khi truy cập vào các đối tượng sử dụng một giao diện điều khiển ứng dụng thử nghiệm, nhưng tôi cần phải có điều này thông qua một dịch vụ WCF, ở đây tôi có ngoại lệ này:

Không thể gọi dịch vụ. Nguyên nhân có thể xảy ra: Dịch vụ ngoại tuyến hoặc không thể truy cập được; cấu hình phía máy khách không khớp với proxy ; proxy hiện tại không hợp lệ. Tham khảo dấu vết ngăn xếp cho chi tiết hơn . Bạn có thể cố gắng khôi phục lại bằng cách bắt đầu một proxy mới, khôi phục để cấu hình mặc định, hoặc làm mới các dịch vụ

Cách duy nhất tôi tìm thấy có làm việc này là, loại bỏ các hoa tiêu tại một trong những đơn vị, bởi vì có các nhà điều hướng ở cả hai bên gây ra một vòng lặp vô hạn.

Có cách nào để làm việc này mà không xóa các trình điều hướng không?

+0

Bạn có thể đăng mã của phương thức dịch vụ đang phát hành không? Ngoài ra, bạn có thể đăng các chi tiết của ngoại lệ mà bạn đang nhận được không? – Joon

Trả lời

7

Có hai vấn đề nếu bạn cố gắng sử dụng WCF:

  • vấn đề đầu tiên: Bạn có muốn trở lại đơn vị liên quan không? Luôn tắt tải chậm khi làm việc với WCF/serialization và đảm bảo rằng bạn tự sử dụng Bao gồm cho các mối quan hệ bạn thực sự muốn quay trở lại. Nếu không, tải chậm sẽ tải tất cả các mối quan hệ trong đồ thị đối tượng. Hơn nữa tùy thuộc vào cách thức dịch vụ của bạn xử lý vòng đời của ngữ cảnh, việc tải chậm có thể xảy ra khi ngữ cảnh đã được xử lý.
  • Bạn phải nói với bộ nối tiếp về tham chiếu vòng tròn hoặc xóa tham chiếu vòng tròn. WCF theo mặc định sử dụng DataContractSerializer. Để loại bỏ tham chiếu vòng tròn, bạn có thể đánh dấu một trong các thuộc tính điều hướng đó với thuộc tính IgnoreDataMember hoặc bạn có thể chỉ cần nói cho trình nối tiếp về tham chiếu vòng tròn bằng cách đánh dấu tất cả các thực thể với thuộc tính DataContract(IsReference = true) và tất cả thuộc tính thành viên cần được tuần tự hóa với thuộc tính DataMember.
+0

Điều này vẫn còn hợp lệ trong EF6? Tôi thấy câu trả lời của bạn hơi bị lỗi thời. Ngoài ra, vì tôi đang sử dụng các lớp tự phát từ DB và không phải là phương thức Code First, luôn có vấn đề này với việc ghi đè mô hình dữ liệu. Làm thế nào để chúng ta đối phó với điều đó? (Các lớp học một phần là tuyệt vời nhưng không giải quyết được vấn đề phân bổ.) –

+1

@KonradViltersten: Nếu các lớp của bạn được tự động tạo bởi mẫu T4, bạn có thể sửa đổi mẫu trực tiếp để tạo ra các thuộc tính bạn cần. Điều đó sẽ đảm bảo các thuộc tính sẽ được đặt ra mỗi khi mô hình tái tạo. –

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